#!/bin/bash
AGORA_DEFAULT_BuildLevel="devel"
#AGORA_DEFAULT_BuildLevel="release"

export AGORA_SERV="/usr/local/share/agora/current/services"
# TODO ldap
# source ldapFunctions

# Modificacao feita em 31/10/12: insercão da funcao para chamada do Xvnc.
# TODO
# Bureau agora manquant
# peut-etre inutile de l'ajouter.

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraDaemon()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{

	touch ${AGORA_LOG}/test_agora_daemon
	
	return 0;

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraTitle()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{
clear
echo "
+---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---+
:      _  __   __   __  _
:     /| /  \ /  \ |  \ |\      _               _
:    /-| |  _ |<>| |__/ |-\    |_ollaborative  |_spaces
:   /  | \__/ \__/ |  \ |  \   __|paces        |_ollaboratifs
:
+---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---~~---+
 AGORA_SERV..............: ${AGORA_SERV}"
}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraInfos()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

  agoraTitle

echo "
+                            +                                                 +
:
:    Nom ....................: agora.sh
:    
:    Langage ................: Bourne shell
:    Encodage ...............: ${AGORA_DEFAULT_Encoding}
:    Date de cr�ation .......: 06/06/2006
:    Date de modification ...: 14/03/2007
:    Version ................: 3.2.1 [${1}]
:    Auteur .................: Pascal Dug�nie <dugenie@lirmm.fr>
:    Organisation............: Laboratoire d'Informatique de Robotique
:    ........................: et de Micro�lectronique de Montpellier
:
:    Description ............: Fonctions et variables globales du  
:    ........................: gestionnaire d'espaces collaboratifs: 6 PCS
:    ........................: AMS, GMS, MMS, HMS, NMS, EMS plus agora, misc, et gsd
:
+                            +                                                 +
"
}












#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraSetup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

# mis dans sysconfig/agora depuis la version agora 3.4
# export AGORA_PATH="/usr/local/share/agora/current"


   # Actuellement la valeur de $1 est soit "current" ou "devel"(defaut)
   AGORA_BuildLevel=${1}

   if [ -z "${AGORA_BuildLevel}" ]; then
      AGORA_BuildLevel="${AGORA_DEFAULT_BuildLevel}"
   fi

   agoraInfos ${AGORA_BuildLevel}
   
   export   AGORA_DEFAULTS="${AGORA_PATH}/installation/defaults"
   export       AGORA_LOCK="${AGORA_PATH}/installation/lock"
   export AGORA_SKEL_GROUP="${AGORA_PATH}/resources/templates/group"
   export  AGORA_SKEL_ROOT="${AGORA_PATH}/resources/templates/root"

   export        AGORA_TMP="/tmp/agora"

   if [ ! -d "${AGORA_TMP}" ]; then
       mkdir       "${AGORA_TMP}"
       chmod 777   "${AGORA_TMP}"
   fi
   
#   export         AGORA_HOME_DIR=$( cat ${AGORA_DEFAULTS}/resources_location )

   export AGORA_DEFAULT_MainGroup=$( cat ${AGORA_DEFAULTS}/main_group    )
   export  AGORA_DEFAULT_Encoding=$( cat ${AGORA_DEFAULTS}/encoding      )
   export     AGORA_DEFAULT_Email=$( cat ${AGORA_DEFAULTS}/email_address )  
   export      AGORA_DEFAULT_Lang=$( cat ${AGORA_DEFAULTS}/lang          )

   # DEFAULT_MAIN_GID=$(   cat ${AGORA_DEFAULTS}/main_gid)

}


# agoraSetup ${AGORA_DEFAULT_BuildLevel}


# export AGORA_HOME_DIR=${AGORA_HOME_DIR}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraInstall()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local RootOwner="${1}" ;
   
   local   RootUser="${RootOwner}" ;
   local  RootGroup="${RootOwner}" ;
   

   agoraSetup devel

   # pour �viter de se trouver dans le r�pertoire d'installation
   cd

   if [ -f ${AGORA_LOCK} ]; then

     echo "! Une seule installation est possible"
     return
   
   fi
 

   if [ -z ${RootGroup} ]; then

     RootGroup=${AGORA_DEFAULT_MainGroup}  ;

   fi


   # TODO: V�rifier que le nom du groupe n'existe pas
   # s'il existe, demander de supprimer l'existant ou
   # de choisir un autre nom.


   # Affecter les nouvelles valeurs pour la d�sinstallation
   echo $RootGroup  > ${AGORA_DEFAULTS}/main_group_installed


   # Une seule installation par noeud de serveur (hostname) ou OU est possible
   touch ${AGORA_LOCK}

   userdel   "${RootUser}"      2> /dev/null

   groupadd  --key GID_MIN=${AGORA_GID_MIN} "${RootGroup}"


   mkdir ${AGORA_HOME_DIR}
   mkdir ${AGORA_HOME_GROUPS}
   mkdir ${AGORA_HOME_DIR}/users
   mkdir ${AGORA_HOME_DIR}/nodes

   INITIAL_USERHOME="${AGORA_HOME_DIR}/users/${RootUser}"

   # Cr�er les credentials pour l'utilisateur principal  

   useradd --key UID_MIN=${AGORA_UID_MIN} -d "${INITIAL_USERHOME}" -c "<${AGORA_DEFAULT_Email}>" -m -k "${AGORA_SKEL_ROOT}" -g "${RootGroup}" "${RootUser}"


   # Initialisation du container principal

   gmsContainerInit "${RootGroup}" "${RootUser}" "${AGORA_SKEL_GROUP}"


#   USERHOME="${INITIAL_USERHOME}/${MEMBERS_DIR}/${RootUser}"

#   chown -R   "${RootUser}" "${USERHOME}"
   
#   usermod -d "${USERHOME}"  "${RootUser}"

#   echo "> Installation de ${RootGroup} dans ${AGORA_HOME_GROUPS}/${RootGroup}"


   miscTraceInit

}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraUninstall()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   agoraSetup devel


   echo -n "? Etes-vous certain de vouloir proc�der � la d�sinstallation? [o/n]:... "
   read CHOIX

   if [[ "${CHOIX}" != [OoYy] ]]; then
       echo "> Abandon"
       return 0
   fi


   rm -f  ${AGORA_LOCK}



   if [ ! -d "${AGORA_HOME_DIR}" ]; then
       echo "> Rien � d�sinstaller"
       return 0
   fi


   declare -a UserList=($(miscQueryAllUsers "${ThisGroup}" "${ThisMember}"))

   for i in ${UserList[@]}; do

      echo "> Suppression de l'utilisateur ${i}"
  
      killall -u ${i}

      userdel ${i}
      
   done


   
# TODO 

    declare -a GroupList=($(miscQueryAllGroups "${ThisGroup}" "${ThisMember}"))

#   declare -a TARGET=($(find ${AGORA_HOME_GROUPS} -mindepth 1 -maxdepth 1 -printf "%f " ))


   for i in ${GroupList[@]}; do

      echo "> Suppression du groupe ${i}"

      groupdel ${i} 2> /dev/null 

   done


   # Archiver les donn�es des groupes
   # ou alors mettre les nodes � l'ext�rieur de Agora Ressources

   tar cvzf ${AGORA_HOME_DIR}/../agora--nodes.tgz ${AGORA_HOME_DIR}/nodes

   rm -rf ${AGORA_HOME_DIR}
   

   

   declare -a AgoraEnvironmentVariables=( $(env | grep AGORA_ | cut -d "=" -f 1 ) ) ;
   
   for i in ${AgoraEnvironmentVariables[@]}; do
      
      unset ${i}
   
   done


   
   echo
   echo      "/etc/group"
   tail -n 3 "/etc/group"
   
   echo
   echo      "/etc/passwd"
   tail -n 3 "/etc/passwd"


}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraTrigger()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
# Essa é a funcao inicial para a criacão das abas, ela é chamada pelo comando "agora start" localizada nas pastas Autostart do usuário"

#Da mesma forma, o agora stop encerra a secao, ele é chamando através das pasta shutdown do kde
 
echo "entrou no Trigger com " ${1} " " ${2} "e " ${3} >> /tmp/gsd.log

   local    ThisGroup="${1}" ; 
   local   ThisMember="${2}" ; 
   local  TriggerType="${3}" ;

   if   [ "${TriggerType}" == 'start'  ]; then

      gmsPresenceIndicate  "${ThisGroup}"  "${ThisMember}"  "add"
      echo ${FUNCNAME} >> /tmp/${ThisMember}--${ThisGroup}.txt
            

   elif [ "${TriggerType}" == 'stop'   ]; then

	echo "entrou no trigger stop" >> /tmp/gsd.log
      gmsPresenceIndicate  "${ThisGroup}"  "${ThisMember}"  "remove"

   fi

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraMonitorSemaphore()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   while [ "true" ]; do

     find /tmp/semaphore* -mmin +1 -exec rm -f {} \;

     sleep 60
     
   done
   
}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraMonitorSemaphore_off()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   while [ "true" ]; do

     find /home/agora/groups/*/Presence/* > /tmp/ago

     sleep 60
     
   done
   
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraMonitorTransfile()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   while [ "true" ]; do

#      echo "- " >> /tmp/agoraMonitor


cd /tmp

find transfile--*--end > transfile_temp

NBFiles=$(wc -l transfile_temp | cut -d " " -f 1)


while [ ${NBFiles} -gt 0 ]; do

   #sed -n "${NBFiles},//p" transfile_temp

   AA=$(sed -n "${NBFiles},//p"  transfile_temp)

   BB=$(echo $AA | sed -e "s/transfile--//" -e "s/--end//")

   FileOwner=$(echo $BB | sed 's/--.*$//' )
    FileName=$(echo $BB | sed 's/^.*--//' )

   chown  $FileOwner.agora $AA
   chmod  o-rxw $AA

   mv $AA /home/agora/users/$FileOwner/Documents/$FileName

   #mv $AA /home/$FileOwner/Documents/$FileName

   NBFiles=$[NBFiles-1];

done

cd -


      sleep 1;
      
   done


}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function agoraMonitor()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

    agoraMonitorTransfile 2> /dev/null &

    agoraMonitorSemaphore 2> /dev/null &
    
    agoraMonitorPresence  2> /dev/null &

}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#
#         P A R A M E T R E S
#
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

# Valeurs par d�faut
DEFAULT_HRS_EVENTS_BASE="10000"


# Structure des r�pertoires des groupes
AUTORISATIONS_DIR="Autorisations"  ;
    VARIABLES_DIR="Variables"      ;
      HISTORY_DIR="History"        ;
      MEMBERS_DIR="Members"        ;
     PRESENCE_DIR="Presence"       ;
    TEMPLATES_DIR="Templates"      ;
   PARAMETERS_DIR="Parameters"     ;
NOTIFICATIONS_DIR="Notifications"  ;


    GROUP_TEMPLATE="${TEMPLATES_DIR}/group"    ;

#  dans /etc/sysconfig/agora
#  AGORA_HOME_GROUPS="${AGORA_HOME_DIR}/groups" ;



# Valeurs param�triques (dans Parameters)
HRS_EVENTS_BASE="hrsEventsBase"

# Fichiers de variables (dans Variables)
HRS_EVENTS_INDEX="hrsEventsIndex"

# Services de base
GMS_SERVICE_ID="gms"
AAS_SERVICE_ID="aas"
MMS_SERVICE_ID="mms"
HRS_SERVICE_ID="hrs"

# Roles g�n�riques
MANAGER_ROLE_ID="manager"

# Fichiers syst�mes
ICE_DIR=/tmp/.ICE-unix
USERS_BASE=/etc/passwd
GROUPS_BASE=/etc/group

# Autres param�tres
AGORA_UID_MIN="10000"
AGORA_GID_MIN="${AGORA_UID_MIN}"









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#
#
#          M I S C E L L A N E O U S
#
#
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function  miscMatrix()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

  declare -a V1=(aa bb cc)
  declare -a V2=(xx yy)
  
  declare -a M1=('${V1[${AA}]}' '${V2[${AA}]}')
  
  AA=0; BB=0
  eval echo ${M1[$BB]}
  AA=1
  eval echo ${M1[$BB]}

  AA=0; BB=1
  eval echo ${M1[$BB]}
  AA=1
  eval echo ${M1[$BB]}
  
}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function  miscDataInit()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local      ThisGroup="${1}"   ;
   local     ThisMember="${2}"   ;
   local     TargetData="${3}"   ;
   local   TemplateData="${4}"   ;


   if [ -z "${TargetData}" ]; then
   
      echo   "! ERREUR: miscDataSet()" ;
      return 0                         ;
   
   else

      rm    -rf "${TargetData}"                  ;

      cp    -r  "${TemplateData}" "${TargetData}" ;

# pose un pb avec le rep .vnc
#      chmod -R   ug+rw  "${TargetData}" ;
      chmod -R   o-rw   "${TargetData}" ;

      chown -R  "${ThisMember}"."${ThisGroup}" "${TargetData}" ;
      
   fi

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscDataClear()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{

   local   ThisGroup="${1}" ;   #
   local  ThisMember="${2}" ;   #
   local  TargetData="${3}" ;   # Chemin absolu

   if [ -z "${TargetData}" ]; then

      MESSAGE="Pas de r�pertoire sp�cifi�"
      TAG="${FUNCNAME}--ERREUR"
      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

   else

      # TODO: Pr�voir un moyen de conna�tre l'�tat de l'op�ration
      # (succ�s ou �chec)
      rm -rf    "${TargetData}"
   
      miscDataWrite "${ThisGroup}" "${ThisMember}" "${TargetData}"

#      TARGET_BASE="$(basename ${TargetData})"

#      MESSAGE="Efface ${TARGET_BASE}"
#      TAG="${FUNCNAME}--${TARGET_BASE}"

   fi
   
}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscDataWrite()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   local TargetData="${3}" ;

   mkdir      "${TargetData}" 2> /dev/null
   chmod 770  "${TargetData}"

   chown -R   "${ThisMember}.${ThisGroup}" "${TargetData}"

#   TARGETDIR="$(basename ${TargetData})"
#   MESSAGE="Ecrit ${TARGETDIR}"
#   TAG="${FUNCNAME}--${TARGETDIR}"
      
#   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryAllUsers()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup=${1}
   local ThisMember=${2}
 

#      ${MODE}QueryAllUsers
 
      echo -n $( miscQueryAllItems "${ThisGroup}" "${ThisMember}" "users" )

#   echo -n "${AllUsers}"
   
#   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${FUNCNAME}()" "${FUNCNAME}"
   
}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMembersByRole()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup=${1}
   local   ThisMember=${2}
   local  ThisService=${3}
   local     ThisRole=${4}
  
   LookupDir="${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}/${ThisService}/Roles/${ThisRole}"
   
   echo -n $(find "${LookupDir}" -mindepth 1 -maxdepth 1 -printf "%f ")       

}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupPresence()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup=${1}
   local   ThisMember=${2}
  
   LookupDir="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}"
   
   echo -n $(find "${LookupDir}" -mindepth 1 -maxdepth 1 -printf "%f ")       

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

# function miscQueryMembersPresent()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

#{
#   local  ThisGroup="${1}" ;
#   local ThisMember="${2}" ;

#   local PresentMembersPath="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}"
   
#   echo -n $(find ${PresentMembersPath} -mindepth 1 -maxdepth 1 -printf "%f ")       
   
#}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscRandom()
# selectionne une ligne au hasard dans un fichier d'entr�e

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{
	local ThisFile="${1}"

	n=$RANDOM

	# limite n � la taille max du fichier (RANDOM renvoie valeurs sign�es sur 16 bits)
	# attention � la division par 0 si fichier vide
	 
	let "n%=$(cat ${ThisFile} | wc -l)"

	head -n $n ${ThisFile} | tail -n 1

}











#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryAllGroups()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
  
   echo -n $( miscQueryAllItems "${ThisGroup}" "${ThisMember}" "groups" )
       
#   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${FUNCNAME}()" "${FUNCNAME}"
   
}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupMembers()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;

   local MembersPath="${AGORA_HOME_GROUPS}/${ThisGroup}/Members"
   
   echo -n $(find ${MembersPath} -mindepth 1 -maxdepth 1 -printf "%f ")       
   
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryAllItems()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   local   ThisItem="${3}" ;

   echo -n $(find "${AGORA_HOME_DIR}/${ThisItem}" -mindepth 1 -maxdepth 1 -printf "%f ")       

#   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${FUNCNAME}()" "${FUNCNAME}"

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupsCreatedBy()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;

   echo -n $(find "${AGORA_HOME_GROUPS}" -mindepth 1 -maxdepth 1 -user "${ThisMember}" -printf "%f ")

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupID()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   ThisGroup=${1}
   
   GROUP_ID=$(cat /etc/group | grep "^$ThisGroup:" | cut -d ":" -f 3  2> /dev/null )
   
   echo -n "${GROUP_ID}"
  
}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberID()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   ThisUser=${1}
   
   USER_ID=$(id -u $ThisUser 2> /dev/null)
   
   echo -n "${USER_ID}"
  
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberEmailAddress()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   ThisUser=${1}
   
   UserEmail=$(cat /etc/passwd | grep "^$ThisUser:" | cut -d ":" -f 5  2> /dev/null )
   
   echo -n "${UserEmail}"
  
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberLang()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

echo "TODO"

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberGroups()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

  local  ThisGroup="${1}" ;
  local ThisMember="${2}" ;

  echo $(id -Gn ${ThisMember})

}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryRequestsToJoinGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

  local  ThisGroup="${1}" ;

  echo -n $(find "${AGORA_TMP}/NotificationsExternal/${ThisGroup}" -mindepth 1 -maxdepth 1 -printf "%f " 2> /dev/null) 

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberMainGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisMember="${1}" ;

     MAIN_GID=$(grep "^${ThisMember}:" /etc/passwd | cut -d ":" -f 4)

   MAIN_GROUP=$(grep ":${MAIN_GID}:"   /etc/group  | cut -d ":" -f 1)

   echo -n "${MAIN_GROUP}"

}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberCurrentGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisMember="${1}"         ;

   local  CurrentGroup="$(id -gn)"  ;

   echo   -n "${CurrentGroup}"      ;

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupLang()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;

   local     LangParameter="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraLang"
   
   if [ -f "${LangParameter}" ]; then
   
      echo $(cat "${LangParameter}")
      
   else  

      echo "${AGORA_DEFAULT_Lang}"
      
   fi

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryMemberAlias()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;

   local     ThisAliasFile="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/alias"
   
   if [ -f "${ThisAliasFile}" ]; then
   
      echo $(cat "${ThisAliasFile}")
      
   else  

      echo "${ThisMember}"
      
   fi

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryDisplay()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local   DisplayMode="${3}" ;
   local    ThisCaller="${4}" ;

   echo $(cat "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/${DisplayMode}/.agora/gsdDisplay")

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryInitialHome()

# OBSOLETE (Dans gsdStart()  )

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;

   echo $(grep "^${ThisMember}:" /etc/passwd | cut -d ":" -f 6)

}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetDisplay()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local   DisplayMode="${3}" ;
   local  DisplayValue="${4}" ;

  touch ${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/${DisplayMode}/.agora/gsdDisplay
 echo "passou pelo touch do gsdDisplay" >> /tmp/gsd.log

   echo "${DisplayValue}" > "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/${DisplayMode}/.agora/gsdDisplay"

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetGroupLang()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local     ThisLang="${3}" ;

   local  LangParameter="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraLang"
   
   if [ -z  "${ThisLang}" ]; then
   
      echo "${AGORA_DEFAULT_Lang}"   > "${LangParameter}"
   
   else
   
      echo "${ThisLang}" > "${LangParameter}"

   fi

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupDescription()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local       ThisGroup="${1}" ;
   local      ThisMember="${2}" ;

   cat "${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraDescription"


}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetGroupDescription()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local       ThisGroup="${1}" ;
   local      ThisMember="${2}" ;
   local ThisDescription="${3}" ;

   local  DescriptionParameter="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraDescription"
   
   if [ -z  "${ThisDescription}" ]; then
   
      echo "${ThisGroup}"   > "${DescriptionParameter}"
   
   else
   
      echo "${ThisDescription}" > "${DescriptionParameter}"

   fi

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryDesktopTab()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local TargetMember="${3}" ;
   local  DisplayMode="${4}" ;

   local Target="${AGORA_TMP}/DisplayTabs/${ThisGroup}--${ThisMember}--${TargetMember}--${DisplayMode}"
   
   if [ -f "${Target}" ]; then

      echo "true"

   fi
   
}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetDesktopTab

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local TargetMember="${3}" ;
   local  DisplayMode="${4}" ;

   local Target="${AGORA_TMP}/DisplayTabs/${ThisGroup}--${ThisMember}--${TargetMember}--${DisplayMode}"
   
   touch ${Target}

   chmod 666 ${Target}

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscUnsetDesktopTab()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
#   local TargetMember="${3}" ;
#   local  DisplayMode="${4}" ;

   rm -f ${AGORA_TMP}/DisplayTabs/${ThisGroup}*${ThisMember}*
 
#   echo "${AGORA_TMP}/DisplayTabs/${ThisGroup}*${ThisMember}" > /tmp/rm_tabs
   
}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscQueryGroupVisibleFlag()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local       ThisGroup="${1}" ;
   local      ThisMember="${2}" ;

   local  VisibleFlagParameter="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraVisibleFlag"

   if [ -f  "${VisibleFlagParameter}" ]; then

      cat "${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraVisibleFlag"
   
   else
   
      echo "true"

   fi

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetGroupVisibleFlag()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local       ThisGroup="${1}" ;
   local      ThisMember="${2}" ;
   local ThisVisibleFlag="${3}" ;

   local  VisibleFlagParameter="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraVisibleFlag"
   
   if [ -z  "${ThisVisibleFlag}" ]; then
   
      echo "true"   > "${VisibleFlagParameter}"
   
   else
   
      echo "${ThisVisibleFlag}" > "${VisibleFlagParameter}"

   fi

}













#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetMemberAlias()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local    ThisAlias="${3}" ;

   local     ThisAliasFile="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/alias"
   
   if [ -z  "${ThisAlias}" ]; then
   
      echo "${ThisMember}"   > "${ThisAliasFile}"
   
   else
   
      echo "${ThisAlias}" > "${ThisAliasFile}"

   fi

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscChangePassword()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local ThisPassword="${3}" ;

   echo "TODO"

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSetLanguageAndEncoding()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}"  ;
   local   ThisMember="${2}"  ;
   local ThisLanguage="${3}"  ;
   local ThisEncoding="${4}"  ;
   local     ThisDest="${5}"  ;

   # Valeurs de ThisLanguage: fr_FR, fr, en, en_US
   # Valeurs de ThisEncoding: ISO-8859-15, UTF-8

   local  FLAG_IN="AGORA_LANGUAGE_PREFS_BEGIN"
   local FLAG_OUT="AGORA_LANGUAGE_PREFS_END"

   if [ -z "${ThisDest}" ]; then

     local TargetProfile="${AGORA_HOME_DIR}/users/${ThisMember}/.bash_profile"

#     echo "HomeDest=$TargetProfile"

   else
     
     local TargetProfile="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/share/.bash_profile"

#     echo "GroupDest=$TargetProfile"

   fi
   
   cat "${TargetProfile}" | sed "/${FLAG_IN}/,/${FLAG_OUT}/d" > "${TargetProfile}.tmp"
   rm -f "${TargetProfile}" 
   mv "${TargetProfile}.tmp" "${TargetProfile}"
   
   chown ${ThisMember}.${ThisGroup} "${TargetProfile}"


function off()
{

echo "
# ${FLAG_IN}
export LC_ALL=${ThisLanguage}.${ThisEncoding}
export LC_PAPER=${ThisLanguage}.${ThisEncoding}
export LC_ADDRESS=${ThisLanguage}.${ThisEncoding}
export LC_MONETARY=${ThisLanguage}.${ThisEncoding}
export LC_NUMERIC=${ThisLanguage}.${ThisEncoding}
export LC_TELEPHONE=${ThisLanguage}.${ThisEncoding}
export LC_MESSAGES=${ThisLanguage}.${ThisEncoding}
export LC_IDENTIFICATION=${ThisLanguage}.${ThisEncoding}
export LC_COLLATE=${ThisLanguage}.${ThisEncoding}
export LANG=${ThisLanguage}.${ThisEncoding}
export LC_MEASUREMENT=${ThisLanguage}.${ThisEncoding}
export LANGUAGE=${ThisLanguage}.${ThisEncoding}
export LC_CTYPE=${ThisLanguage}.${ThisEncoding}
export LC_TIME=${ThisLanguage}.${ThisEncoding}
export LC_NAME=${ThisLanguage}.${ThisEncoding}

# ${FLAG_OUT}
" >> "${TargetProfile}"

export LC_ALL=${ThisLanguage}.${ThisEncoding}
export LC_PAPER=${ThisLanguage}.${ThisEncoding}
export LC_ADDRESS=${ThisLanguage}.${ThisEncoding}
export LC_MONETARY=${ThisLanguage}.${ThisEncoding}
export LC_NUMERIC=${ThisLanguage}.${ThisEncoding}
export LC_TELEPHONE=${ThisLanguage}.${ThisEncoding}
export LC_MESSAGES=${ThisLanguage}.${ThisEncoding}
export LC_IDENTIFICATION=${ThisLanguage}.${ThisEncoding}
export LC_COLLATE=${ThisLanguage}.${ThisEncoding}
export LANG=${ThisLanguage}.${ThisEncoding}
export LC_MEASUREMENT=${ThisLanguage}.${ThisEncoding}
export LANGUAGE=${ThisLanguage}.${ThisEncoding}
export LC_CTYPE=${ThisLanguage}.${ThisEncoding}
export LC_TIME=${ThisLanguage}.${ThisEncoding}
export LC_NAME=${ThisLanguage}.${ThisEncoding}
}


#   source "${TargetProfile}" > /dev/null

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscTraceInit()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   rm -rf /tmp/agoratraces
   mkdir /tmp/agoratraces
   chmod 777 /tmp/agoratraces

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscTrace()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local FunctionPointer="${1}" ;
   local ThisGroup="${2}" ;
   local ThisMember="${3}" ;
   local Info="${4}" ;
   
   Suffix="${FunctionPointer}--${ThisGroup}--${ThisMember}";

   echo "${Info}" > /tmp/agoratraces/$(uuidgen -t)--${Suffix};

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscGenerateCryptedPasswordImage()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}"
   local   ThisMember="${2}"
   local  in_PASSWORD="${3}"
   
   SHIFT_GEOMETRY="+15+15"
   IMAGE_FOND="${AGORA_HOME_GROUPS}/${ThisGroup}/Images/encodage/fond.png"
   
   MEMBER_IMAGES="${AGORA_HOME_GROUPS}/${ThisGroup}/Members/${ThisMember}/Images"
   miscDataWrite "${ThisGroup}" "${ThisMember}" "${MEMBER_IMAGES}"
   miscDataWrite "${ThisGroup}" "${ThisMember}" "${MEMBER_IMAGES}/encodage"

   IMAGE_TARGET="${MEMBER_IMAGES}/encodage/password.png"
   
   emsServiceQuery "${ThisGroup}" "${ThisMember}" "ImageMagick"

   # voir exemples et syntaxe sur http://www.imagemagick.org
   montage -annotate "${SHIFT_GEOMETRY}" "${in_PASSWORD}" ${IMAGE_FOND} ${IMAGE_TARGET}

   chown "${ThisMember}"."${ThisGroup}" "${IMAGE_TARGET}"
   chmod 600 "${IMAGE_TARGET}"

   MESSAGE="G�n�ration de l'image d'un mot de passe"
   TAG="${FUNCNAME}--${in_PACKAGE}"
     
   hrsEventRecord "${ThisGroup}" "${ThisMember}"  "${MESSAGE}"  "${TAG}"
 
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSemaphoreInfo()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
    echo"

La communication entre bureaux est r�alis�e � travers un protocole
applicatif orient�-services, le DCoP Desktop Communication Protocol.
    
A chaque instance de bureau est associ�e un serveur DCOP dont l'adresse
et le jeton d'authentification sont sp�cifi�s dans une variable d'environnement
appel�e DCOPAUTH.

Lorsqu'un processus �mis par un bureau A veut communiquer avec un bureau B,
il doit d'abord exporter la variable d'environement DCOPAUTH � la valeur
de l'adresse du serveur DCOP du bureau B.

Les procesus de connexion aux bureaux, personnels et partag�s sont asynchrones.

Supposons que 2 utilisateurs U1 et U2 appartiennent � plusieurs groupes communs.

Lorsqu'ils se connectent, ils s'envoient mutuellement une s�rie d'�venenements
asynchrones qui acc�dent � une meme ressource (ici la variable d'environnement DCOPAUTH).

Un procesus qui �crit une valeur dans cette variable � l'instant t va ensuite la lire
un instant t+T. T p�riode d'ex�cution du processus.

Pour r�soudre le pb de conflit, nous proposons l'usage d'un s�maphore afin de s�rialiser
les acc�s � la variable DCOPAUTH.

quatre fonctions sont propos�es:

semaphoreUp()
semaphoreDown()
semaphoreTiming()
semaphoreFlush()

Variables globales:
- Jeton d'occupation
- File d'attente des processus arriv�s
- 1 r�seau de Tempos (1 par processus entr� dans la file d'attente)

Lorsqu'une tempo �choit le processus associ� sort de
la file d'attente et pr�empte le jeton

De temps en temps nous avons un blocage. Le jeton est pris par un processus
bloqu� et tous les �v�nement de timers sont masqu�s.
"
}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSemaphoreClean()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
    local SemName="${1}"

    rm -f /tmp/${SemName}*

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSemaphoreTiming()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local       SemName="${3}" ;
   local     TimerName="${4}" ;
   local TimerDuration="${5}" ;

   local  CancelFlag="/tmp/${SemName}--${ThisGroup}--${ThisMember}--${TimerName}.cancel"
   
   sleep ${TimerDuration}

   if [  -f "${CancelFlag}" ]; then
   
      echo "$FUNCNAME--if--$ThisGroup--$ThisMember--$SemName--$TimerName" >> /tmp/semtest
  
      rm -f "${CancelFlag}"
  
   else
   
      miscSemaphoreDown "${ThisGroup}" "${ThisMember}" "${SemName}" "${TimerName}"

      echo "$FUNCNAME--else--$ThisGroup--$ThisMember--$SemName--$TimerName" >> /tmp/semtest

      chmod 666 /tmp/semtest
   
   fi

   rm -f "${CancelFlag}"

}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSemaphoreUp()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{


   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local       SemName="${3}" ;
   local     TimerName="${4}" ;
   local TimerDuration="${5}" ;
   
   local MFifo=$(cat "/tmp/${SemName}" 2> /dev/null)

   echo $[${MFifo}+1] > /tmp/${SemName}
   chmod 666 /tmp/${SemName}

   if [ -z "${MFifo}" ]; then
      MFifo="0"
   fi
      
   echo "$FUNCNAME--in--$ThisGroup--$ThisMember--$SemName--${TimerName}--${MFifo}" >> /tmp/semtest
   chmod 666 /tmp/semtest


   miscSemaphoreTiming "${ThisGroup}" "${ThisMember}" "${SemName}" "${TimerName}" "${TimerDuration}" &


   while [ "${MFifo}" -gt "0" ]; do
  
        echo "$FUNCNAME--while--$ThisGroup--$ThisMember--$SemName--${TimerName}--${MFifo}" >> /tmp/semtest

        sleep 1;
        			
	if  [ ! -f "/tmp/${SemName}.lock" ]; then
	
	     echo "$FUNCNAME--if--$ThisGroup--$ThisMember--$SemName--${TimerName}--${MFifo}" >> /tmp/semtest
    
	     MFifo=$[${MFifo}-1]
	
	fi
	
   done


   touch "/tmp/${SemName}.lock"
   chmod 666 "/tmp/${SemName}.lock"

   echo "$FUNCNAME--lock--$ThisGroup--$ThisMember--$SemName--${TimerName}--${MFifo}" >> /tmp/semtest


}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSemaphoreDown()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;
   local     SemName="${3}" ;
   local   TimerName="${4}" ;

   local  SemIndex=$[$(cat "/tmp/${SemName}" 2> /dev/null)-1]
   local  CancelFlag=/tmp/${SemName}--${ThisGroup}--${ThisMember}--${TimerName}.cancel
   
   touch $CancelFlag
   chmod 666 $CancelFlag

   echo ${SemIndex} > /tmp/${SemName}

   if [  "${SemIndex}" -le "0" ]; then

#         SemIndex="0"        
      rm -f /tmp/${SemName}

   fi


   rm -f /tmp/${SemName}.lock

   echo "$FUNCNAME--out--$ThisGroup--$ThisMember--$SemName--$TimerName--$SemIndex" >> /tmp/semtest


}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ G S D ~
#
#                   G R I D
#                 S H A R E D
#                D E S K T O P
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdStart()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
	echo "entrou no gsdStart com ${1} ${2} ${3} e a home é ${HOME}" >> /tmp/gsd.log
   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;
   local DisplayMode="${3}" ;

# semaphore

   local        TimerName="TN_${ThisGroup}--${ThisMember}--${EventType}"     ;
   local TimerDurationSec="50"                                               ;
   local    SemaphoreName="semaphore_${FUNCNAME}"                            ;


   miscSemaphoreUp "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}" "${TimerDurationSec}"


#   InitialHome=$( miscQueryInitialHome "${ThisGroup}" "${ThisMember}" )

#   if [ "${HOME}" == "${InitialHome}" ]; then

#      DisplayMode="view"


      
	echo "Chamando gsdDesktopOpen ${ThisGroup} ${ThisMember} ${DisplayMode}" >> /tmp/gsd.log
      gsdDesktopOpen "${ThisGroup}" "${ThisMember}" "${DisplayMode}"

	echo "Chamando gsdDesktopShow ${ThisGroup} ${ThisMember} ${DisplayMode}" >> /tmp/gsd.log
      gsdDesktopShow "${ThisGroup}" "${ThisMember}" "${DisplayMode}"

      MESSAGE="Lancement d'un bureau en mode <--${DisplayMode}--> pour <--${ThisMember}-->"
      TAG="${FUNCNAME}"
    
#   else

      
#    gsdDesktopOpen "${ThisGroup}" "${ThisMember}" "share"
#    gsdDesktopShow "${ThisGroup}" "${ThisMember}" "share"
   
#      MESSAGE="<*${HOME}*> different de <*${InitialHome}*> pour <*${ThisMember}*>"
#      TAG="${FUNCNAME}--otherHome"

#   fi


   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


   miscSemaphoreDown "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}"



}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdDesktopShow()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
echo " Entrou no Dekstop show com ${1} ${2} ${3}" >> /tmp/gsd.log
   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;
   local DisplayMode="${3}" ;

# PDU 3.2.0   
#   PRESENCE="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}"
#   declare -a DisplayList=($(find "${PRESENCE}" -mindepth 1 -maxdepth 1 -printf "%f "))


   declare -a DisplayList=($(miscQueryGroupPresence "${ThisGroup}" "${ThisMember}" ))


   if   [ "${DisplayMode}" == "share" ]; then
echo "share e o displaylist é ${DisplayList} " >> /tmp/gsd.log
   
     for i in ${DisplayList[@]}; do
                  
#          if [ $(miscQueryDesktopTab "${ThisGroup}" "${ThisMember}"  "${i}"   "${DisplayMode}") == "false" ]; then
      	     echo "Chamando gsdDesktopDisplay ${ThisGroup} ${ThisMember}  ${i} ${DisplayMode}" >> /tmp/gsd.log
	     gsdDesktopDisplay "${ThisGroup}" "${ThisMember}"   "${i}"     "${DisplayMode}" &
	  
#             miscSetDesktopTab "${ThisGroup}" "${ThisMember}"  "${i}"
	     
#          fi

      done

   

   elif [ "${DisplayMode}" == "view" ]; then

         gsdDesktopDisplay "${ThisGroup}" "${ThisMember}" "${ThisMember}" "${DisplayMode}" &

   fi


}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdDesktopDisplay()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
echo " Entrou no DekstopDisplay com ${1} ${2} ${3} ${4}" >> /tmp/gsd.log
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local TargetMember="${3}" ;
   local  DisplayMode="${4}" ;

   local   ThisDesktopTab=$(miscQueryDesktopTab "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${DisplayMode}" )
echo "resultado da miscQueryDesktopTab = ${ThisDesktopTab}" >> /tmp/gsd.log

   if [ "${ThisDesktopTab}" == "true" ]; then
      	     
      return

   fi



# TODO: normalement cette commanade devrait se trouver � la fin
   miscSetDesktopTab "${ThisGroup}" "${ThisMember}"  "${TargetMember}"  "${DisplayMode}" 
	     



   if [ ${DisplayMode} == "share" ]; then

      local ThisTitle=$( miscQueryMemberAlias "${ThisGroup}" "${TargetMember}" )

      if [ "${TargetMember}" != "${ThisMember}" ]; then
   
          VNCARGS="${VNCARGS}"" -viewonly"
          
      fi

   else
   
      local ThisTitle="${ThisGroup}"
      VNCARGS="-x11cursor -nocursorshape"
   fi


#   local ThisDisplayFile="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${TargetMember}/${DisplayMode}/.agora/gsdDisplay"
   
   local     ThisAuth="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/gsdPassword"

  local      VNCARGS="${VNCARGS}"" -encodings tight -nojpeg -passwd ${ThisAuth} -title ${ThisTitle}"


   local count="0"

   MESSAGE="${VNCARGS} -- ${ThisDisplayFile}"
   TAG="${FUNCNAME}--${DisplayMode}--${ThisDisplay}--1"

   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


   while [ -z "${ThisDisplay}" ]; do

        ThisDisplay=$( miscQueryDisplay     "${ThisGroup}" "${TargetMember}" "${DisplayMode}" "${FUNCNAME}" )
	echo " o miscQueryDisplay deu ${ThisDisplay}" >> /tmp/gsd.log

      
      echo "     VIEWER ${ThisGroup} ${TargetMember} ${DisplayMode}   ${count}" >> /tmp/semtest

      
      count=$[count+1];
	
#	if  [ "${count}" -gt 10000 ]; then
 

       if  [ "${count}" -gt 50 ]; then
            MESSAGE="${VNCARGS} -- ${ThisDisplayFile}"
            TAG="${FUNCNAME}--${DisplayMode}--${ThisDisplay}--ERREUR"
            hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

            echo "gsdDesktopDisplay: ${ThisGroup} ${TargetMember} ${DisplayMode}" >> /tmp/semtest
            return
        fi
	
#   done

#   MESSAGE="${VNCARGS} -- ${ThisDisplayFile}"
#   TAG="${FUNCNAME}--${DisplayMode}--${ThisDisplay}--2"

#   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"
      
	
      #vncviewer localhost:${ThisDisplay} ${VNCARGS}  2> /tmp/viewer.log

	
      echo "chamou o vncviwer localhost:${ThisDisplay} ${VNCARGS}" >> /tmp/gsd.log

      
      sleep 1;

   done

vncviewer localhost:${ThisDisplay} ${VNCARGS} 
#vncviewer :${ThisDisplay} ${VNCARGS}





}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdDesktopRun()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

echo "TODO"



}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdDesktopOpen()

# il faut consid�rer la sym�trie groupe-membre et membre-groupe
# ce que le groupe voit du membre et ce que le membre voit du groupe
# C'est � dire deux bureaux imbriqu�s.
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


{
   echo "entrou no gsdDesktopOpen com ${1} ${2} ${3}" >> /tmp/gsd.log
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local  DisplayMode="${3}" ;



#   local        TimerName="TN_${DisplayMode}"     ;
#   local TimerDurationSec="20"                    ;
#   local    SemaphoreName="semaphore_${FUNCNAME}" ;

#   miscSemaphoreUp "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}" "${TimerDurationSec}"




   DESKTOP_GEOMETRY=$(cat "${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/gsdGeometryGroup")

   DESKTOP_AUTHFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/gsdPassword"
#   DESKTOP_ARGS="-geometry ${DESKTOP_GEOMETRY} -name ${DESKTOP_NAME} -rfbauth ${DESKTOP_AUTHFILE}"
   DESKTOP_ARGS=""

   HOME="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/${DisplayMode}"

   TMP="${HOME}/tmp"
   TMPDIR="${TMP}"

   Idx=$(: - geometry "${DisplayGeometry}" uuidgen | cut -d "-" -f 2)
   DISPLAY_TMP="${TMP}/gsdDisplay--$Idx"
   
   
   DisplayValue=$( miscQueryDisplay "${ThisGroup}" "${ThisMember}" "${DisplayMode}" "${FUNCNAME}" )




#   if [ "${DisplayMode}" == "share" ]; then
#      DisplayGeometry="1024x720" 
#   else
#      DisplayGeometry="1024x744"
#   fi

  if [ "${DisplayMode}" == "share" ]; then
      DisplayGeometry="1020x720" 
   else
      DisplayGeometry="1020x744"
   fi


# SE NÃO TEM DISPLAY VALUE, FAZER AS COISAS ABAIXO,O QUE É PROVAVEL
   if [ -z "${DisplayValue}" ]; then
	echo "entrou no if do display value" >> /tmp/gsd.log
#   if [ ! -f "${HOME}/.bash_profile_extra" ]; then

#      echo 'export DCOPAUTHORITY=${HOME}/.dcop_auth' > ${HOME}/.bash_profile_extra
#      echo 'export  ICEAUTHORITY=${HOME}/.ice_auth'  >> ${HOME}/.bash_profile_extra
     
#      chmod 755  ${HOME}/.bash_profile_extra

#      echo "source .bash_profile_extra" >> ${HOME}/.bash_profile

#   fi

touch ${HOME}/.dcop_auth
touch ${HOME}/.ice_auth


export DCOPAUTHORITY=${HOME}/.dcop_auth
export  ICEAUTHORITY=${HOME}/.ice_auth



echo DCOPAUTH: ${DCOPAUTHORITY} >> /tmp/semtest

      #rm -f $DCOPAUTHORITY
      #rm -f $ICEAUTHORITY

      #      vncserver "${DESKTOP_ARGS}" 2> ${DISPLAY_TMP}

#      vncserver -nocursor -geometry "${DisplayGeometry}" -rfbauth ${DESKTOP_AUTHFILE} 2> ${DISPLAY_TMP}


#function off0()
#{
#ThisLanguage="en_US"
#ThisEncoding=".ISO-8859-1"

#LC_ALL=${ThisLanguage}${ThisEncoding}
#LC_PAPER=${ThisLanguage}${ThisEncoding}
#LC_ADDRESS=${ThisLanguage}${ThisEncoding}
#LC_MONETARY=${ThisLanguage}${ThisEncoding}
#LC_NUMERIC=${ThisLanguage}${ThisEncoding}
#LC_TELEPHONE=${ThisLanguage}${ThisEncoding}
#LC_MESSAGES=${ThisLanguage}${ThisEncoding}
#LC_IDENTIFICATION=${ThisLanguage}${ThisEncoding}
#LC_COLLATE=${ThisLanguage}${ThisEncoding}
#LANG=${ThisLanguage}${ThisEncoding}
#LC_MEASUREMENT=${ThisLanguage}${ThisEncoding}
#LANGUAGE=${ThisLanguage}${ThisEncoding}
#LC_CTYPE=${ThisLanguage}${ThisEncoding}
#LC_TIME=${ThisLanguage}${ThisEncoding}
#LC_NAME=${ThisLanguage}${ThisEncoding}
#}


# NÃO TEM VNCSERVERRRRRR

	#Xvnc -geometry "${DisplayGeometry}" -rfbauth ${DESKTOP_AUTHFILE} 2> ${DISPLAY_TMP}

# CHAMADA ORIGINAL:
     	#vncserver -geometry "${DisplayGeometry}" -rfbauth ${DESKTOP_AUTHFILE} 2> ${DISPLAY_TMP}
	
#CHAMADA COM OUTRA AUTH:
	#vncpasswd ${DESKTOP_AUTHFILE}
	#vncserver -geometry 1020x744 -rfbauth /home/agora/users/alice/.vnc/passwd 2> /tmp/vncout




# 
# 

	#vncserver -geometry "${DisplayGeometry}" -rfbauth ${DESKTOP_AUTHFILE} 2> ${DISPLAY_TMP}

# 

	#vncpasswd -f ${DESKTOP_AUTHFILE} 2> /tmp/passwd.log
	local DISP_DESKTOP=$(unbGetFreeDesktop)


	#Xvnc :${DISP_DESKTOP} -desktop X -httpd /usr/share/vnc/classes -auth /home/agora/users/"${ThisMember}"/.Xauthority -geometry "${DisplayGeometry}" -depth 24 -rfbwait 120000 -rfbauth "${HOME}"/.vnc/passwd -fp catalogue:/etc/X11/fontpath.d/ -co /usr/share/X11/rgb.txt -kb -rfbauth ${DESKTOP_AUTHFILE} &

 #echo "Chamou Xvnc :${DISP_DESKTOP} -desktop X -httpd /usr/share/vnc/classes -auth /home/agora/users/"${ThisMember}"/.Xauthority -geometry "${DisplayGeometry}" -depth 24 -rfbwait 120000 -rfbauth "${HOME}"/.vnc/passwd -fp catalogue:/etc/X11/fontpath.d/ -co /usr/share/X11/rgb.txt -kb -rfbauth ${DESKTOP_AUTHFILE}" >> /tmp/gsd.log



	vncserver -geometry "${DisplayGeometry}" -rfbauth ${DESKTOP_AUTHFILE} 2> ${DISPLAY_TMP}



#echo " executou vncserver -geometry ${DisplayGeometry} -rfbauth ${DESKTOP_AUTHFILE}" >> /tmp/gsd.log

	
      chmod og+r $DCOPAUTHORITY
      chmod og+r $ICEAUTHORITY

#INDEX AFFICHAGE ORIGINAL ABAIXO:
 
        #INDEX_AFFICHAGE=$(grep 'desktop' "${DISPLAY_TMP}" | cut -d ":" -f 2)



	#INDEX_AFFICHAGE=${DISP_DESKTOP}
	#AFFICHAGE_FIRST=$(grep 'desktop' "${DISPLAY_TMP}" | cut -d ":" -f 2)
	#INDEX_AFFICHAGE=$(cut -d " " "${AFFICHAGE_FIRST}" -f1)
	INDEX_AFFICHAGE=$(grep 'desktop' "${DISPLAY_TMP}" | cut -d ":" -f 2 | cut -d " " -f1)
    	echo $(cat "${DISPLAY_TMP}") >> /tmp/gsd.log
	
	echo "INDEX:" >> /tmp/gsd.log
	echo $( cat "${INDEX_AFFICHAGE}") >> /tmp/gsd.log


 
      if [ -z "${INDEX_AFFICHAGE}" ]; then
	echo "entrou no if do INDEX" >> /tmp/gsd.log
         MESSAGE="$(cat ${DISPLAY_TMP})" 
         TAG="${FUNCNAME}--ERREUR"

         hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

         return

      fi


     miscSetDisplay "${ThisGroup}" "${ThisMember}" "${DisplayMode}" "${INDEX_AFFICHAGE}"
      

      rm -f  ${DISPLAY_TMP}

      
      MESSAGE="D�marrage du bureau ${INDEX_AFFICHAGE} pour ${ThisMember}"
      TAG="${FUNCNAME}--${DisplayMode}--${INDEX_AFFICHAGE}"

      hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


   fi


#rm -f /tmp/rfbk

#echo $[$(cat "/tmp/rfblock" 2> /dev/null)-1] > /tmp/rfblock

#echo -n "${ThisGroup}--${ThisMember}--${DisplayMode}  <----- " >> /tmp/rfblock2

#cat "/tmp/rfblock" >> /tmp/rfblock2


#   miscSemaphoreDown "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}"


}


#-------------------------------------------------------------------------------------------
#Funcoes do Caio:

function unbGetFreeDesktop()
{

declare -a List=($(unbQueryDesktops))

	#for i in ${List[@]}; do
	
	#maior=$((List[0]))
	maior=20
	i=1
	while [ $i -lt ${#List[@]} ]; do
		#echo $((List[$i]))
		#echo $(($i +5))
		#expr "$i+1" | bc -l
		
		comp=$((List[$i]))
		
		#echo " Comparando: ${maior} e ${comp}"
		
		if [ $(($maior)) -lt $(($comp)) ]; then
			#echo "entrou no if"
			maior=$comp
			
		
		fi
		let i++ 
	done

#echo "o maior número foi ${maior}"
#echo "o próximo desktop seria $((${maior}+1))"
echo -n $((${maior}+1))

} 


function unbQueryDesktops()
{

echo -n $(ls -a /tmp/ | grep '\.X'| grep lock | cut -d "X" -f2 | cut -c1,2 | grep -v "-")

}



function unbCallXvnc()
{

local DESKTOP=$(unbGetFreeDesktop)

echo "Xvnc :${DESKTOP}"

#Xvnc :${DESKTOP}

}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdStop()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
echo "gsdStop com ${1} ${2}" >> /tmp/gsd.log

   local ThisGroup=${1}
   local ThisMember=${2}

   gsdDesktopClose ${ThisGroup} ${ThisMember}  "share"

   gsdDesktopClose ${ThisGroup} ${ThisMember}  "view"


   MESSAGE="Arr�t des bureaux de ${ThisMember} pour le groupe ${ThisGroup}"
   TAG="${FUNCNAME}"

   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gsdDesktopClose()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
echo "gsdDesktopClose com ${1} ${2} 3 ${3}" >> /tmp/gsd.log
   local   ThisGroup=${1}
   local  ThisMember=${2}
   local DisplayMode=${3}

     
   HOME="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/${DisplayMode}"
   DISPLAY_FILE="${HOME}/.agora/gsdDisplay"

   vncserver -kill :$(cat ${DISPLAY_FILE})
 
   rm -f ${DISPLAY_FILE}

   MESSAGE="Arr�t du bureau de ${ThisMember} pour le groupe ${ThisGroup} en mode ${DisplayMode}"

   TAG="${FUNCNAME}--${DisplayMode}"

   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

}













#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ A A S ~
#
#          A U T H E N T I C A T I O N
#           A U T O R I S A T I O N
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasInit()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   
   
   AUTORISATIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}"

   agoraSetup

   miscDataClear  "${ThisGroup}"  "${ThisMember}"  "${AUTORISATIONS}"


   aasRoleCreate  "${ThisGroup}"  "${ThisMember}"  "${AAS_SERVICE_ID}"  "${MANAGER_ROLE_ID}"

   aasRoleCreate  "${ThisGroup}"  "${ThisMember}"  "${MMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}"

   aasRoleCreate  "${ThisGroup}"  "${ThisMember}"  "${GMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}"

   aasRoleCreate  "${ThisGroup}"  "${ThisMember}"  "${HRS_SERVICE_ID}"  "${MANAGER_ROLE_ID}"

              
   hrsEventRecord "${ThisGroup}"  "${ThisMember}"  "aasInit()"      "aasInit"
  
}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasCredentialsCreate()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
    local       ThisGroup="${1}"
    local      ThisMember="${2}"
    local    TargetMember="${3}"
    local    in_NEW_EMAIL="${4}"
    local  TargetLanguage="${5}"

# TODO: traiter le parametre TargetLanguage


#    USER_ID=`miscQueryMemberID $ThisMember`   
#   GROUP_ID=`miscQueryGroupID  $ThisGroup`

#    IS_ALLOWED=$(mmsManagementMembersQuery  "${ThisGroup}" "${ThisMember}")
#    aasRoleQuery "${ThisGroup}" "${ThisMember}" "management" "members"


SKELETON="${AGORA_HOME_GROUPS}/${ThisGroup}/${TEMPLATES_DIR}/homedir"
 HOMEDIR="${AGORA_HOME_DIR}/users/${TargetMember}"


#MainGroup=$(miscQueryMemberMainGroup "{TargetMember}")

#HOMEDIR="${AGORA_HOME_GROUPS}/${MainGroup}/${MEMBERS_DIR}/${TargetMember}"



#   HOMEDIR="${AGORA_USERS_LOCATION}/${TargetMember}"


   # Note 1: V�rifier options par d�faut dans /etc/login.defs
   # Note 2: L'option -m permet de cr�er le r�pertoire utilisateur

   # Attention: toujours utiliser l'option -m avec l'option -k

   useradd --key UID_MIN=${AGORA_UID_MIN} -d "${HOMEDIR}" -m -k ${SKELETON} -c "<${in_NEW_EMAIL}>" -g "${ThisGroup}" "${TargetMember}"

   emsServiceQuery "${ThisGroup}" "${ThisMember}" "expect"

   miscSetLanguageAndEncoding "${ThisGroup}"  "${TargetMember}"   "${TargetLanguage}"  "${AGORA_DEFAULT_Encoding}"



# TODO mettre un processus al�atoire
  SECRET=`uuidgen | cut -d "-" -f 2`

#   SECRET="${TargetMember}_0"

#SECRET='dummy'

   autopasswd "${TargetMember}" "${SECRET}" > /dev/null

#   miscGenerateCryptedPasswordImage 

# nbsSendCryptedPasswd

   echo -n "${SECRET}"

   MESSAGE="secret:${SECRET}"
   TAG="${FUNCNAME}--${TargetMember}"

   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasCredentialsSuppress()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


{
    local    ThisGroup="${1}"
    local   ThisMember="${2}"
    local TargetMember="${3}"


    # TODO: v�rifier l'autorisation

    declare -a IsMemberOfGroups=($(id -Gn ${TargetMember}))

    MESSAGE="${FUNCNAME}()"
    TAG="${FUNCNAME}--${EventType}"


    hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"


    for i in ${IsMemberOfGroups[@]}; do

        mmsMemberRemove "${i}" "${ThisMember}" ${TargetMember} 
      
    done
   

    killall -u ${TargetMember}

    userdel -r ${TargetMember}


}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasRoleCreate()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{
   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local TargetService="${3}" ;
   local    TargetRole="${4}" ;
   

# PB de dealock avec aasInit
#   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${AAS_SERVICE_ID}" "${MANAGER_ROLE_ID}")


#   if [ "${IS_ALLOWED}" == "true" ]; then  


      AUTORISATIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}"
   
      miscDataWrite "${ThisGroup}" "${ThisMember}" "${AUTORISATIONS}/${TargetService}"

      miscDataWrite "${ThisGroup}" "${ThisMember}" "${AUTORISATIONS}/${TargetService}/Roles"


      ROLE="${AUTORISATIONS}/${TargetService}/Roles/${TargetRole}"
   
      miscDataWrite "${ThisGroup}" "${ThisMember}" "${ROLE}"

      miscDataWrite "${ThisGroup}" "${ThisMember}" "${ROLE}/${ThisMember}"
     

      MESSAGE="Creation du role <* ${TargetRole} *> pour le service <* ${TargetService} *>"
      TAG="${FUNCNAME}--${TargetService}--${TargetRole}"

      hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


#   else
   
#      MESSAGE="Op�ration non autoris�e"
#      TAG="aasRoleCreate--FORBIDDEN"

#      hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"
    
#   fi



}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasRoleAssign()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;   
   local  TargetMember="${3}" ;
   local TargetService="${4}" ;
   local    TargetRole="${5}" ;

   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${AAS_SERVICE_ID}" "${MANAGER_ROLE_ID}")

   if [ "${IS_ALLOWED}" == "true" ]; then

      AUTORISATIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}"

      TARGET_ROLE="${AUTORISATIONS}/${TargetService}/Roles/${TargetRole}"

      # TODO: Verifier que TargetRole existe bien, sinon le cr�er
      # ...

      miscDataWrite "${ThisGroup}" "${ThisMember}" "${TARGET_ROLE}/${TargetMember}"

      MESSAGE="Role ${TargetService} ${TargetRole} assign� � ${TargetMember}"
      TAG="${FUNCNAME}--${TargetMember}--${TargetService}--${TargetRole}"

   else
   
      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"
    
   fi
   
   hrsEventRecord "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function aasRoleQuery()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
{
   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;
   local  in_SERVICE="${3}" ;
   local     in_ROLE="${4}" ;

   AUTORISATIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}"

   MEMBER_LIST="${AUTORISATIONS}/${in_SERVICE}/Roles/${in_ROLE}/${ThisMember}"
   
   if [ -d ${MEMBER_LIST} ]; then
      echo "true"
   else
   
      MESSAGE="<* ${ThisMember} *> n'a pas le r�le de <* ${in_ROLE} *> \
      sur le service <* ${in_SERVICE} *> pour le groupe <* ${ThisGroup} *> "
	      
      TAG="${FUNCNAME}--FORBIDDEN"
      hrsEventRecord "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "${TAG}"
      echo "false"
   fi

}






function aasRoleRename()
{

echo "TODO"

}


function aasRoleSupress()
{

echo "TODO"


}







#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ G M S ~
#
#                 G R O U P S
#              M A N A G E M E N T
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+



# I M P O R T A N T ! ! !   La relation Groupe-Container est une bijection



# Les op�rations sur groupes (ou containers) se font depuis un conteneur
# externe
# Ex gmsContainerCreate g m n  (le membre m du groupe g cree un conteneur n)
# Pour cela m est gms manager du groupe g
# Idem pour gmsContainerDestroy

# Le pb avec gmsContainerDestroy est que le membre m du groupe g peut ne
# pas avoir de droits vis a vis
# du groupe n. D'ou le dilemme: peut-on autoriser tous les gms manager �
# d�truire n'importe quel groupe?
# Il faut dans ce cas cr�er la nouvelle notion de propri�t�: ownership

# Lors de la cr�ation d'un groupe, le membre fondateur, ex (g,m), dispose
# de tous les droits de manager sur aas, mms, gms, etc. qu'il peut d�l�guer.
# Et en plus il est owner du groupe, c'est � dire que lui seul peut
# ex�cuter un gmsContainerDestroy.
# Ceci peut �tre effectu� par un (g,*), n'importe quel membre du groupe g
# (*,m), le membre m quel que soit sont groupe ou (g,m), le membre d'un groupe
# pr�cis.





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsContainerInit()

# Appel� par gmsContainerCreate et par agoraInstall
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}"   ;
   local    ThisMember="${2}"   ;
   local  ThisTemplate="${3}"   ;

   local  GroupResources="${AGORA_HOME_GROUPS}/${ThisGroup}"   ;
   
   local   GroupTemplate="${GroupResources}/${GROUP_TEMPLATE}" ;

   miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupResources}" "${ThisTemplate}" ;

   miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupTemplate}"  "${ThisTemplate}" ;
   
    
   aasInit  "${ThisGroup}"  "${ThisMember}"  ;

   hrsInit  "${ThisGroup}"  "${ThisMember}"  ;

   mmsInit  "${ThisGroup}"  "${ThisMember}"  ;
   
   gmsInit  "${ThisGroup}"  "${ThisMember}"  ;

   emsInit  "${ThisGroup}"  "${ThisMember}"  ;

   nbsInit  "${ThisGroup}"  "${ThisMember}"  ;

}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsContainerCreate()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ; 
   local NewContainer="${3}" ;
   local     ThisLang="${4}" ;
   local    ThisDescr="${5}" ;
   local    IsVisible="${6}" ;


   local    ThisAlias=$(miscQueryMemberAlias "${ThisGroup}" "${ThisMember}" )
     
   local   IS_ALLOWED=$(aasRoleQuery   "${ThisGroup}" "${ThisMember}" "${GMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}" )

   local     GROUP_ID=$(miscQueryGroupID "${NewContainer}")

   local NEW_GROUP_TEMPLATE="${AGORA_HOME_GROUPS}/${ThisGroup}/${GROUP_TEMPLATE}"

   
   if   [ "${IS_ALLOWED}" == "false" ]; then

      # V�rification de l'habilitation du membre � pouvoir cr�er une session de groupe

      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   elif [ -n "${GROUP_ID}" ]; then

      # V�rification de l'unicit� du nom de groupe

      MESSAGE="Groupe <* ${NewContainer} *> d�j� existant"
      TAG="${FUNCNAME}--ERREUR"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   else


   groupadd --key GID_MIN=${AGORA_GID_MIN}   "${NewContainer}"

   gmsContainerInit        "${NewContainer}" "${ThisMember}"  "${NEW_GROUP_TEMPLATE}"

   miscSetMemberAlias      "${NewContainer}" "${ThisMember}"  "${ThisAlias}"

   miscSetGroupLang        "${NewContainer}" "${ThisMember}"  "${ThisLang}"
    
   miscSetGroupDescription "${NewContainer}" "${ThisMember}"  "${ThisDescr}"

   miscSetGroupVisibleFlag "${NewContainer}" "${ThisMember}"  "${IsVisible}"



#   if [ -n "${ThisLang}" ]; then
#       echo "${ThisLang}" > ${NEW_GROUP_LANGUAGE}
#   fi

#   if [ -n "${ThisDescr}" ]; then
#       echo "${ThisDescr}" > ${NEW_GROUP_DESCRIPT}
#   fi



   
   MESSAGE="Groupe <* ${in_TARGET_GROUP} *> cr��"
   TAG="${FUNCNAME}--${NewContainer}"

   hrsEventRecord  "${ThisGroup}"    "${ThisMember}" "${MESSAGE}" "${TAG}"


#   hrsEventRecord  "${NewContainer}" "${ThisMember}" "${MESSAGE}" "${TAG}"


# cr�er une entr�e pour partage samba ou nfs ici.

   fi


}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsContainerDestroy()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ; 
   local TargetGroup="${3}" ;


# TODO r�soudre le pb du droit d'un membre de pouvoir d�truire tt mes groupes s'il est gms manager
#   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${GMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}")

# Autre possibilit�
#   IS_ALLOWED=$(aasRoleQuery "${TargetGroup}" "${ThisMember}" "${AAS_SERVICE_ID}"  "${MANAGER_ROLE_ID}")



   local TargetGroupID=$(miscQueryGroupID "${TargetGroup}")
   
 
   # V�rification de l'habilitation du membre � pouvoir supprimer un groupe
  
   if   [ "${IS_ALLOWED}" == "false" ]; then

      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   # V�rification de l'existence de lidentifiant de groupe pass� en param�tre

   elif [ -z "${TargetGroupID}" ]; then

      MESSAGE="Groupe <* ${TargetGroup} *> non-existant"
      TAG="${FUNCNAME}--ERREUR"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   else


      # Attention: groupdel renvoie une erreur si le groupe est groupe primaire d'un de ses membres
      # Dans ce cas il faut assigner un groupe primaire unique � tous les membres
      # ou alors creer une option de type IsHostGroup qui rend le groupe indestructible


      groupdel       "${TargetGroup}"

      rm -rf         "${AGORA_HOME_GROUPS}/${TargetGroup}"
   
      rm -f          ${AGORA_HOME_DIR}/users/*/Desktop/Documents/${TargetGroup}


      #   miscDataClear  "${ThisGroup}" "${ThisMember}" "${AGORA_HOME_GROUPS}/${TargetGroup}"

      MESSAGE="Groupe <* ${TargetGroup} *> supprim�"
      TAG="${FUNCNAME}--${TargetGroup}"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

   fi
   

}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsPresenceIndicate()

# Appel�e par le script agora dans .kde/Autostart
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

#essa funcao verifica 

 echo "entrou no gmsPResenceIndicate com " ${1} " " ${2}  "e " ${3} >> /tmp/gsd.log
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   local  EventType="${3}" ;


   local  FirstTimeFlag=${HOME}/.agora/agoraFirstTime

   if [ ! -f "${FirstTimeFlag}" ]; then

#esse if verifica se é a primeira vez que o usuaŕio acessa, se for ele cria o arquivo FirstTimeFlag=${HOME}/.agora/agoraFirstTime
# O First time abriria uma pagina pra wiki do lirmm

# PDU d�sactive la page accueil
#      konqueror http://agora.lirmm.fr/wiki/index.php/Aide_Collabureau &
  

      touch "${FirstTimeFlag}"

   fi


# semaphore

#   local        TimerName="TN_${ThisGroup}--${ThisMember}--${EventType}"     ;
#   local TimerDurationSec="50"                                               ;
#   local    SemaphoreName="semaphore_GLOBAL"                                 ;



#   miscSemaphoreUp "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}" "${TimerDurationSec}"


   local MainGroup=$(miscQueryMemberMainGroup ${ThisMember});

   MESSAGE="${FUNCNAME}()"
   TAG="${FUNCNAME}--${EventType}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"



# Note importante: a partir du groupe principal sont lanc�s les
# environnments de tous les autres groupes.
# Le grp principal n'a donc pas d'onglet sur le bureau priv�.


#o If abaixo é essencial ao funcionamento do programa, por que é responsavel por chamar as funcoes de abas de acordo com as seguintes condicoes:


   if [ "${ThisGroup}" == "${MainGroup}" ]; then
	echo "Entrou no if " "${ThisGroup}" "== " "${MainGroup}" >> /tmp/gsd.log

# A LINHA ABAIXO DECLARA COMO UMA ARRAY O RESULTADO DO QUERY, ISSO APENAS FAZ SENTIDO NO CASO DA PESSOA FAZER PARTE DE MAIS DE UM GRUPO 15/09/20120 CAIO
      declare -a IsMemberOfGroups=($(miscQueryMemberGroups "${ThisGroup}" "${ThisMember}" ))

# ESTE FOR PASSA PELOS GRUPOS A QUAL A PESSOA PERTENCE E ATIVA O GMSPRESENCE, COMO O IF INTERNO NÃO TEM ELSE, NÃO EXISTE CONDIĆAO PARA O CASO MAIS COMUM, POR ISSO NADA É FEITO.

#O PARAMETRO EVENT TYPE PASSA PARA A PRÓXIMA FUNCAO

      for i in ${IsMemberOfGroups[@]}; do

          if [ "${i}" != "${MainGroup}"  ]; then
		echo "entrou no if de dentro do for  para executar o gms Process  ${i}  !=  ${MainGroup}" >>/tmp/gsd.log
		echo "Executando sg  ${i} source /usr/local/share/agora/current/services/agora/agora.sh; gmsPresenceProcess ${i} ${ThisMember} ${EventType}" >>/tmp/gsd.log
            sg  ${i} "source /usr/local/share/agora/current/services/agora/agora.sh; gmsPresenceProcess ${i} ${ThisMember} ${EventType}"

          fi

#CRIAR AQUI UM ESPACO PARA CRIACAO DE ABAS PARA O GRUPO PRINCIPAL, NAO SOMENTE PARA OS SECUNDÁRIOS

      done

	
   

#PARA O CASO DE O GRUPO ATUAL NÃO SER O GRUPO PRINCIPAL DO USUARIO, CHAMAR O GSDSTART NO MODO SHARE
   else
	echo "Vai chamar a funcão de start dentro do else" >>/tmp/gsd.log
  
   echo "CHamando: gsdStart ${ThisGroup} ${ThisMember} share" >>/tmp/gsd.log
   gsdStart "${ThisGroup}" "${ThisMember}" "share"


   fi

#AS LINHAS ABAIXO É O PRIMEIRO TESTE, ELA É EXECUTADA SEM NENHUMA CONDIĆÃO ESPECÍFICA
#gmsPresenceProcess "${ThisGroup}" "${ThisMember}" "${EventType}"  #deu erro de vnc e do agoraDisplay

#gmsPresenceProcess "${ThisGroup}" "${ThisMember}" "${EventType}" # mesmo erro, trabalhar nisso


#   miscSemaphoreDown "${ThisGroup}" "${ThisMember}" "${SemaphoreName}" "${TimerName}"

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsPresenceProcess()

# Appel�e par gmsPresenceIndicate()
# a. indique la prs�sence de ce membre au groupe sp�cifi�
# b. lance des serveurs RFB pour ce groupe
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

#FUNCAO QUE CHAMA O GSD START E ADICIONA A PRESENCA DO USUARIO
	echo "Entrou no gmsPresenceProcess com ${1} ${2} ${3} e a home é ${HOME}" >> /tmp/gsd.log
   local  ThisGroup="${1}"
   local ThisMember="${2}"
   local  EventType="${3}"



   if  [ ${EventType} == "add"    ]; then


      gsdStart          "${ThisGroup}"  "${ThisMember}"  "view"

#      gsdInitPanel       "${ThisGroup}"  "${ThisMember}"

      gmsPresenceAdd     "${ThisGroup}"  "${ThisMember}"

   fi

	 
   if [ ${EventType} == "remove" ]; then

      gsdStop            "${ThisGroup}"  "${ThisMember}"

      gmsPresenceRemove  "${ThisGroup}"  "${ThisMember}" 
      
      rm -f /tmp/agora/desktop--${ThisGroup}--${ThisMember}*

   fi

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsInit()

# Initialise les variables utilis�es pour g�rer la pr�sence des membres
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local  ThisGroup="${1}"
   local ThisMember="${2}"
   
 
   miscDataClear "${ThisGroup}" "${ThisMember}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}"

   miscDataClear "${ThisGroup}" "${ThisMember}" "${AGORA_TMP}/DisplayTabs"

   # Fermeture de toutes les sessions utilisateurs ouvertes
   # Un peu violent, mais voir comment faire autrement
   
   # killall -u nobody

   MESSAGE=${FUNCNAME}
   TAG=${FUNCNAME}  
   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"
     
   
}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsPresenceAdd()

# 1. Affiche le bureau partag� chez les autres membres du groupe
# 2. Ajoute un membre dans la liste des membres pr�sents
# Si ce membre est d�j� pr�sent, incr�mente le nombre de sessions ouvertes
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


{
echo "entrou no gmsPresenceAdd com ${1} ${2}" >> /tmp/gsd.log
   local  ThisGroup="${1}"  ;
   local ThisMember="${2}"  ; 

   local    PresenceList="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}"
   local OPENED_SESSIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}/${ThisMember}"
   
   # Affiche le bureau partag� chez les autres membres du groupe
   # si ceci n'est pas d�j� fait


   if [ ! -f "${OPENED_SESSIONS}" ]; then
	echo "não existe o opened sessions" >> /tmp/gsd.log
	

      # PDU 3.2.0
      # declare -a TARGET_MEMBERS=($(find "${PresenceList}" -mindepth 1 -maxdepth 1 -printf "%f " ))

      declare -a TARGET_MEMBERS=($(miscQueryGroupPresence "${ThisGroup}" "${ThisMember}" ))
	echo "antes de entrar no for targer members = ${TARGET_MEMBERS[@]}" >> /tmp/gsd.log
      rm -rf  "${AGORA_HOME_DIR}/users/${ThisMember}/.agora/*"
      rm -rf  "${AGORA_HOME_GROUPS}/${ThisGroup}/Members/${ThisMember}/share/.agora/*"
      rm -rf  "${AGORA_HOME_GROUPS}/${ThisGroup}/Members/${ThisMember}/view/.agora/*"
	

      for i in ${TARGET_MEMBERS[@]}; do
	echo "passando pelas chamadas do agoraDCOP" >> /tmp/gsd.log
        #sudo $AGORA_SERV/agoraDCOP.sh  "${ThisGroup}" "${ThisMember}" "${i}" 2>&1 /tmp/dcoperr.log
	source $AGORA_SERV/agoraDCOP2.sh; agoraDCOP "${ThisGroup}" "${ThisMember}" "${i}" 

         # TODO: l'option -u permet de lancer la commande en tant qu'utilisateur autre que root
	 # Toutefois, voir pourquoi la ligne ci-dessous ne marche pas
         # sudo -u "${i}" agoraDCOP.sh  "${ThisGroup}"  "${i}"

      done
	#echo "depois de entrar no for" >> /tmp/gsd.log

   fi

	echo "isso é depois do if do presenceadd" >> /tmp/gsd.log


   # Incr�mente l'index des sessions
   SESSION_INDEX=$[$(cat "${OPENED_SESSIONS}" 2> /dev/null)+1];
   echo ${SESSION_INDEX} > "${OPENED_SESSIONS}"

  
   MESSAGE="${FUNCNAME}() with ${SESSION_INDEX} open sessions"
   TAG="${FUNCNAME}--${SESSION_INDEX}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}" 


}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function gmsPresenceRemove()

# Retire un membre dans la liste des membres pr�sents
# Si ce membre a plusieurs sessions ouvertes, d�cr�mente le nombre de sessions 
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
	echo "entrou no presence remove" >> /tmp/gsd.log
   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   
   miscUnsetDesktopTab  "${ThisGroup}" "${ThisMember}"

   # Fichier contenant le nombre de sessions ouvertes pour un utilisateur donn�
   OPENED_SESSIONS="${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}/${ThisMember}"

   # on d�cr�mente l'index des sessions      
   SESSION_INDEX=$[$(cat ${OPENED_SESSIONS} 2> /dev/null)-1];
   
   # "-le 0" signifie inf�rieur ou �gal � 0
   if [ "${SESSION_INDEX}" -le "0" ]; then

      rm -f ${OPENED_SESSIONS}
      
   else

      echo "${SESSION_INDEX}" > "${OPENED_SESSIONS}"

   fi

   MESSAGE="gmsPresenceRemove() with ${SESSION_INDEX} open sessions"
   TAG="${FUNCNAME}--${SESSION_INDEX}"
  
   hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}" 

}













#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ M M S ~
#
#              M E M B E R S H I P
#              M A N A G E M E N T
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function mmsInit()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local  ThisGroup=${1} ;
   local ThisMember=${2} ;
   
   local IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${MMS_SERVICE_ID}" "${MANAGER_ROLE_ID}")

   local ThisEmail=$(miscQueryMemberEmailAddress "${ThisMember}")
   local ThisAlias=$(miscQueryMemberAlias "${ThisGroup}" "${ThisMember}")

   if [ "${IS_ALLOWED}" == "true" ]; then

      TARGET="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}"

      miscDataClear "${ThisGroup}" "${ThisMember}" "${TARGET}"
 
# PDU 3.0.7     
      mmsMemberAdd  "${ThisGroup}" "${ThisMember}" "${ThisMember}" "${ThisEmail}" "${ThisAlias}"
                   
      MESSAGE="mmsInit()"
      TAG="${FUNCNAME}"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

   fi

}











#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function mmsMemberAdd()

# Si le membre n'a pas de credentials, celles ci sont cr��es, ainsi qu'un
#    groupe du meme nom.
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local  TargetMember="${3}" ;
   local   TargetEmail="${4}" ;
   local   TargetAlias="${5}" ;

   # mmsMemberAdd(): V�rification des param�tres d'entr�e   


#linha abaixo colocada para teste do passwd 04/04/13
DESKTOP_AUTHFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/gsdPassword"

VNC_DIR="${AGORA_HOME_GROUPS}/${ThisGroup}/Members/${TargetMember}"
   
   if [ -z "${TargetEmail}" ]; then
       TargetEmail="youremail@emailaddress"
   fi

   if [ -z "${TargetAlias}" ]; then
# PDU 3.1.1
#       TargetAlias="${TargetMember}.${ThisGroup}"
       TargetAlias="${TargetMember}"
   fi


   # mmsMemberAdd(): V�rification de l'habilitation du membre ThisMember � pouvoir ajouter un membre au groupe

   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${MMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}")
   
   if   [ "${IS_ALLOWED}" == "false" ]; then

      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   fi


#   IS_AGORA_MEMBER=$(find -name ${TargetMember})

   IS_VALID_MEMBER=$(miscQueryMemberID   "${TargetMember}" )
   IS_VALID_GROUP=$(miscQueryGroupID     "${ThisGroup}"   )


   TargetLanguage=$( miscQueryGroupLang "${ThisGroup}" "${TargetMember}" )
   

    if [ -z "${IS_VALID_MEMBER}" ]; then

           Secret=$(aasCredentialsCreate   "${ThisGroup}" "${ThisMember}"  "${TargetMember}" "${TargetEmail}" "${TargetLanguage}")
           IsNew="true"
    else
           IsNew="false"
    fi

   # puis v�rifier que le groupe existe bien
   # et ainsi ajouter l'utilisateur au groupe


   if [ -n "${IS_VALID_GROUP}" ]; then



       gpasswd -a "${TargetMember}" "${ThisGroup}"

 
 
      
       TARGET_DIR="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${TargetMember}"
       TEMPLATE="${AGORA_HOME_GROUPS}/${ThisGroup}/${TEMPLATES_DIR}/member"
       
#       TargetLanguage=$( cat ${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/agoraLang )

       miscDataInit               "${ThisGroup}"  "${TargetMember}"   "${TARGET_DIR}"   "${TEMPLATE}"  ; 

       miscSetMemberAlias         "${ThisGroup}"  "${TargetMember}"   "${TargetAlias}"

       miscSetLanguageAndEncoding "${ThisGroup}"  "${TargetMember}"   "${TargetLanguage}"  "${AGORA_DEFAULT_Encoding}" "grouplang"


       nbsSelectMessage "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Secret}" "${IsNew}"

       hrsNodeCreate    "${ThisGroup}"  "${ThisMember}"    "${TargetMember}" 
       
       hrsNodeLink      "${ThisGroup}"  "${TargetMember}"
       
	#unbSetPassword "${TargetMember}" "${ThisGroup}"
	

       MESSAGE="Membre <* ${TargetMember} *> ajout� au groupe <* ${ThisGroup} *>"
       TAG="${FUNCNAME}--${TargetMember}"
     
   else
   
       MESSAGE="Impossible d'ajouter <* ${TargetMember} *> au groupe <* ${ThisGroup} *>"
       TAG="${FUNCNAME}--ERREUR"
     
   fi

       hrsEventRecord "${ThisGroup}" "${ThisMember}"  "${MESSAGE}"  "${TAG}"

#alteracoes para teste do passwd:

	#cp -f "${DESKTOP_AUTHFILE}" "${AGORA_HOME_DIR}/users/${TargetMember}/.vnc/"
 	#echo "copiou o arquivo gsdpasswd executando cp ${DESKTOP_AUTHFILE} ${AGORA_HOME_DIR}/users/${TargetMember}/.vnc" 
	#mv -f "${AGORA_HOME_DIR}/users/${TargetMember}/.vnc/gsdPassword" "${AGORA_HOME_DIR}/users/${TargetMember}/.vnc/passwd"
	#echo "renomeou o arquivo"
	#chown "${TargetMember}":"${ThisGroup}" "${AGORA_HOME_DIR}/users/${TargetMember}/.vnc/passwd"
	#echo "executou o chown"

	unbSetPassword "${TargetMember}" "${ThisGroup}"
	su "${TargetMember}" -c "cp "/home/agora/users/${TargetMember}/.vnc/passwd" "${VNC_DIR}/view/.vnc"" 
	su "${TargetMember}" -c "cp "/home/agora/users/${TargetMember}/.vnc/passwd"  "${VNC_DIR}/share/.vnc"" 
	

	#cp -f "${DESKTOP_AUTHFILE}" "${VNC_DIR}/view/.vnc" 
	#mv -f "${VNC_DIR}/view/.vnc/gsdPassword" "${VNC_DIR}/view/.vnc/passwd"
	#chown "${TargetMember}":"${ThisGroup}" "${VNC_DIR}/view/.vnc/passwd"

	#cp -f "${DESKTOP_AUTHFILE}" "${VNC_DIR}/share/.vnc" 
	#mv -f "${VNC_DIR}/share/.vnc/gsdPassword" "${VNC_DIR}/share/.vnc/passwd"
	#chown "${TargetMember}":"${ThisGroup}" "${VNC_DIR}/share/.vnc/passwd"
	
}

#------------------------------------------------------------------------------------------------------------


function unbSetPassword()
{
	local  TargetMember="${1}" ;
	local  ThisGroup="${2}"

	#DESKTOP_AUTHFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/gsdPassword"	
	#echo "Esse é o arquivo ${DESKTOP_AUTHFILE}"
	su "${TargetMember}" -c vncpasswd
	


}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function mmsMemberRemove()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


{
   local    ThisGroup="${1}"  ;
   local   ThisMember="${2}"  ;
   local TargetMember="${3}"  ;

   local    ThisAlias=$( miscQueryMemberAlias "${ThisGroup}" "${TargetMember}" )

# TODO ne pas forcer la suppression
#   local   IS_ALLOWED=$( aasRoleQuery "${ThisGroup}" "${ThisMember}" "${MMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}" )

   IS_ALLOWED="true"
      
   if   [ "${IS_ALLOWED}" == "false" ]; then

      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   fi

   gpasswd -d "${TargetMember}" "${ThisGroup}"

   rm -rf ${AGORA_HOME_GROUPS}/${ThisGroup}/${PRESENCE_DIR}/*${TargetMember}*
   

   rm -rf ${AGORA_HOME_GROUPS}/${ThisGroup}/${AUTORISATIONS_DIR}/*/*/*/${TargetMember}

   rm -rf ${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${TargetMember}

   rm -f  ${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/*/*/Desktop/Documents/${ThisAlias}



   # TODO: Pr�voir de retirer les liens vers les documents de ce membre

   MESSAGE="Membre <* ${TargetMember} *> retir� du groupe <* ${ThisGroup} *>"
   TAG="${FUNCNAME}--${TargetMember}"

   hrsEventRecord  "${ThisGroup}"  "${ThisMember}"  "${MESSAGE}"  "${TAG}"

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function mmsMemberChangeAlias()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local    ThisGroup="${1}" ;
   local   ThisMember="${2}" ;
   local    ThisAlias="${3}" ;

   hrsNodeLink         "${ThisGroup}" "${ThisMember}" "remove"

   miscSetMemberAlias  "${ThisGroup}" "${ThisMember}"  "${ThisAlias}"

   hrsNodeLink         "${ThisGroup}" "${ThisMember}" "add"

}






function mmsSetMainGroup()


{
    local     ThisGroup="${1}" ;
    local    ThisMember="${2}" ;
    local  TargetMember="${3}" ;


   # TODO: verifier que ThisMember est autoris� � le faire

    local_USER_ID=$( miscQueryMemberID  ${TargetMember}  ) ;   
   local_GROUP_ID=$( miscQueryGroupID   ${ThisGroup}     ) ;
   
   # V�rifier que l'utilisateur existe bien,
   # puis v�rifier que le groupe existe bien
   # et ainsi appliquer le changement de groupe principal

   if [ -z ${local_USER_ID} ]; then
   
      MESSAGE="Impossible de changer le groupe principal de de l'utilisateur <* ${TargetMember} *>; utilisateur inexistant"
      TAG="${FUNCNAME}--${TargetMember}--ERREUR_1"
      
      hrsEventRecord ${ThisGroup} ${ThisMember} ${MESSAGE} ${TAG}
      
      return
      
   fi


   if [ -n ${local_GROUP_ID} ]; then

      MESSAGE="Impossible de changer le groupe principal de de l'utilisateur <* ${TargetMember} *>; groupe <* ${ThisGroup} *> inexistant"
      TAG="${FUNCNAME}--${TargetMember}--ERREUR_2"

      hrsEventRecord ${ThisGroup} ${ThisMember} ${MESSAGE} ${TAG}
           
      return
      
   fi


   usermod -g ${ThisGroup} ${TargetMember};

   MESSAGE="Le groupe <* ${ThisGroup} *> devient groupe principal de l'utilisateur <* ${TargetMember} *>."
   TAG="${FUNCNAME}--${TargetMember}"

   hrsEventRecord ${ThisGroup} ${ThisMember} ${MESSAGE} ${TAG}

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ H R S ~
#
#                 H I S T O R Y
#               R E C O R D I N G
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function hrsInit()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local  ThisGroup=${1} ;
   local ThisMember=${2} ;
   
   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${HRS_SERVICE_ID}" "${MANAGER_ROLE_ID}")


   if [ "${IS_ALLOWED}" == "true" ]; then
          
      INIT_INDEX="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/${HRS_EVENTS_BASE}"


      if [ ! -f "${INIT_INDEX}" ]; then
   
         echo "${DEFAULT_HRS_EVENTS_BASE}" > ${INIT_INDEX}

      fi


      EVENTIDFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${VARIABLES_DIR}/${HRS_EVENTS_INDEX}"
      chmod 660 "${EVENTIDFILE}"
      
      cat "${INIT_INDEX}" > "${EVENTIDFILE}"

      miscDataClear "${ThisGroup}" "${ThisMember}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${HISTORY_DIR}"
              
      MESSAGE="hrsInit() with ${INIT_INDEX}"
      TAG="${FUNCNAME}"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"


   fi

}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function hrsEventRecord()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;   
   local ThisMessage="${3}" ;
   local     ThisTag="${4}" ;

   EVENTIDFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${VARIABLES_DIR}/${HRS_EVENTS_INDEX}"

#	TODO pr�voir mutex

   function off()
   {
   	if [ -e ${EVENTIDFILE} ]; then
       		EVENTID=$(cat ${EVENTIDFILE})
   	else
       		EVENTID="0"
   	fi
   
   	echo   "$[1+EVENTID]"               > "${EVENTIDFILE}"


   	HISTFILE="${AGORA_HOME_GROUPS}/${ThisGroup}/${HISTORY_DIR}/${EVENTID}--${ThisTag}"

   	echo   "${ThisMessage}"              > "${HISTFILE}"   

   	chown  "${ThisMember}"."${ThisGroup}"   "${HISTFILE}"

   }
}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function hrsNodeCreate()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

    local   ThisGroup="${1}" ;
    local  ThisMember="${2}" ;
    local TargetMember="${3}" ;
    
   # V�rification de l'habilitation du membre ThisMember � pouvoir ajouter un node

   # TODO pr�voir le role de HRS_MANAGER
   #   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${HRS_SERVICE_ID}"  "${MANAGER_ROLE_ID}")
 
   IS_ALLOWED=$(aasRoleQuery "${ThisGroup}" "${ThisMember}" "${MMS_SERVICE_ID}"  "${MANAGER_ROLE_ID}")
 
   
   if   [ "${IS_ALLOWED}" == "false" ]; then

      MESSAGE="Op�ration non autoris�e"
      TAG="${FUNCNAME}--FORBIDDEN"

      hrsEventRecord  "${ThisGroup}" "${ThisMember}" "${MESSAGE}" "${TAG}"

      return

   fi


   TARGET_DIR="${AGORA_HOME_DIR}/nodes/${TargetMember}--${ThisGroup}"
     TEMPLATE="${AGORA_HOME_GROUPS}/${ThisGroup}/${TEMPLATES_DIR}/node"

   miscDataInit   "${ThisGroup}" "${TargetMember}" "${TARGET_DIR}" "${TEMPLATE}"  ; 
   chmod   770  "${TARGET_DIR}" ;


   MESSAGE="Noeud <* ${ThisGroup}--${TargetMember} *> cr��"
   TAG="${FUNCNAME}--${TargetMember}"
     
   hrsEventRecord "${ThisGroup}" "${ThisMember}"  "${MESSAGE}"  "${TAG}"
  
}








#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function hrsNodeLink()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local    ThisGroup="${1}"
   local   ThisMember="${2}"
   local   ThisAction="${3}"
 

   local  ThisAlias=$( miscQueryMemberAlias "${ThisGroup}" "${ThisMember}" )
   
   local   ThisNode="${AGORA_HOME_DIR}/nodes/${ThisMember}--${ThisGroup}"

   local    MEMBERS="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}"
   
   local    ThisHome="${AGORA_HOME_DIR}/users/${ThisMember}/Desktop/Documents"



   rm -f    "${ThisHome}/${ThisGroup}"

   if [ "${ThisAction}" != "remove" ]; then

       ln -s    "${ThisNode}"  "${ThisHome}/${ThisGroup}"

   fi
   
#   chown  "${ThisMember}"."${ThisGroup}" "${ThisHome}/${ThisGroup}"

   declare -a MEMBERS_LIST=($(find "${MEMBERS}" -mindepth 1 -maxdepth 1 -printf "%f "))


    for i in ${MEMBERS_LIST[@]}; do

          CurrentAlias=$( miscQueryMemberAlias "${ThisGroup}" "${i}" )

          CurrentNode="${AGORA_HOME_DIR}/nodes/${i}--${ThisGroup}"

          rm -f "${MEMBERS}/${i}/share/Desktop/Documents/${ThisAlias}"       

          # normalement l'un ou l'autre existe mais pas les deux
          rm -f "${MEMBERS}/${ThisMember}/share/Desktop/Documents/${CurrentAlias}"  
          rm -f "${MEMBERS}/${ThisMember}/share/Desktop/Documents/${i}"  


#          chown  "${ThisMember}"."${ThisGroup}" "${MEMBERS}/${i}/share/Desktop/Documents/${ThisAlias}"
   
          if [ "${ThisAction}" != "remove" ]; then

             ln -s "${ThisNode}"    "${MEMBERS}/${i}/share/Desktop/Documents/${ThisAlias}"

             if [ "${i}" != "${ThisMember}" ]; then

                ln -s "${CurrentNode}" "${MEMBERS}/${ThisMember}/share/Desktop/Documents/${CurrentAlias}"

             fi

          fi
	     
	  
#          chown  "${ThisMember}"."${ThisGroup}" "${MEMBERS}/${ThisMember}/share/Desktop/Documents/${CurrentAlias}"
	  
#          rm -f "${ThisHome}/${ThisGroup}/${ThisAlias}"
#          ln -s "${ThisNode}" "${ThisHome}/${ThisGroup}/${ThisAlias}"

#          rm -f "${ThisHome}/${ThisGroup}/${CurrentAlias}"
#          ln -s "${CurrentNode}" "${ThisHome}/${ThisGroup}/${CurrentAlias}"

    done


}










#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function hrsEventRetrieve()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local   ThisGroup="${1}" ;
   local  ThisMember="${2}" ;   
   local    in_MATCH="${3}" ;

   # !! Fonction importante mais assez compliqu�e � d�velopper
   
   # Rechercher (grep ou find) dans les fichiers du r�pertoire History/
   # G�n�rer une instance de r�sultats de la requ�te
   # dans l'environnement de l'utilisateur
   # (avec mise � jour automatique)
   # Ceci doit devenir une nouvelle instance de service
   # fork service
   # Mieux, pr�voir un demon lanc� lors de hrsInit
   # qui va lire le contenu d'un r�pertoire de requ�tes
   # Nouvelles req�tes, puis mises � jour (limiter les mises � jour aux derni�res
   # entr�es dans l'historique)

}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ N B S ~
#
#            N O T I F I C A T I O N
#               B R O K E R I N G
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsSelectMessage()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local ThisGroup=${1}
   local ThisMember=${2}
   local TargetMember=${3}
   local TargetSecret=${4}
   local TargetIsNewMember=${5}

   if [ ${TargetIsNewMember} == "true" ]; then
       
       nbsBuildWelcomeMessage "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${TargetSecret}"
       
   else
       
      if [ "${TargetMember}" == "${ThisMember}" ]; then

           nbsBuildNewGroup   "${ThisGroup}" "${ThisMember}" "${TargetMember}"

      else

           nbsBuildAddMember  "${ThisGroup}" "${ThisMember}" "${TargetMember}"

      fi
       
   fi

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
function nbsBuildNewGroup()
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local  TargetMember="${3}" ;
   
   local   ThisMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${ThisMember}"   )
   local TargetMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${TargetMember}" )
   local ThisGroupLanguage=$( miscQueryGroupLang    "${ThisGroup}"   "${ThisMember}"   )
   
   ThisGroupSubjectEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsNewGroup/SubjectEn"
   ThisGroupSubjectFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsNewGroup/SubjectFr"
  
   if [ -z "${TargetMemberAlias}" ]; then
      TargetMemberAlias=${TargetMember};
   fi

   BodyFile="${AGORA_TMP}/bodymail--${ThisGroup}--${ThisMember}--${TargetMember}"

#   cat ${ThisGroupHTMLHead}   > ${BodyFile}

   if [ ${ThisGroupLanguage:0:2} == "en" ]; then 

      Subject="$(cat ${ThisGroupSubjectEn} )" ;

echo "
Dear ${ThisMemberAlias},

This is to confirm that the group ${ThisGroup}
has been created.
You may check at
http://agora.elegi.org

Best regards.

The development team of the AGORA platform
(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.

" >> ${BodyFile}      

#      cat ${ThisGroupBodyEn}   >> ${BodyFile}

   else
   
      Subject="$(cat ${ThisGroupSubjectFr} )" ;

#      cat ${ThisGroupBodyFr}  >> ${BodyFile}

echo "
Un espace de travail collaboratif a �t�
cr�� pour le groupe ${ThisGroup}.

Cet espace de travail est maintenant accessible
� l'adresse suivante:
http://agora.lirmm.fr

Cordialement.

avec les remerciements de l'equipe de
developpement du prototype AGORA
(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.

" >> ${BodyFile}

   fi

#   cat ${ThisGroupHTMLTail}   >> ${BodyFile}	    


   nbsSendEmailNotification "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Subject}" "${BodyFile}"

   MESSAGE="Construction d'un message � ${EmailAddress}"
   TAG="${FUNCNAME}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
function nbsBuildAddMember()
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local  TargetMember="${3}" ;
   
   local   ThisMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${ThisMember}"   )
   local TargetMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${TargetMember}" )
   local ThisGroupLanguage=$( miscQueryGroupLang    "${ThisGroup}"   "${ThisMember}"   )

    ThisGroupHTMLHead="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/HTMLHead"

    ThisGroupHTMLTail="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/HTMLTail"

      ThisGroupBodyEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/BodyEn"   

   ThisGroupSubjectEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/SubjectEn"   
   
      ThisGroupBodyFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/BodyFr" 
   
   ThisGroupSubjectFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsAddMember/SubjectFr"      

   
   if [ -z "${TargetMemberAlias}" ]; then
      TargetMemberAlias=${TargetMember};
   fi

   BodyFile="${AGORA_TMP}/bodymail--${ThisGroup}--${ThisMember}--${TargetMember}"

#   cat ${ThisGroupHTMLHead}   > ${BodyFile}

   if [ ${ThisGroupLanguage:0:2} == "en" ]; then 

      Subject="$(cat ${ThisGroupSubjectEn} )" ;

echo "
Dear ${TargetMemberAlias},

I am pleased to invite you to access to the shared desktop
collaborative service for the group ${ThisGroup}.

Go to
http://agora.sourceforge.net/services

and use you login and password that have been sent to you.

Best regards.

${ThisMemberAlias}
" >> ${BodyFile}      

#      cat ${ThisGroupBodyEn}   >> ${BodyFile}

   else
   
#      Subject="$(cat ${ThisGroupSubjectFr} )" ;

 Subject="[agora] Ajout au groupe ${ThisGroup}"

#      cat ${ThisGroupBodyFr}  >> ${BodyFile}

echo "
Vous avez �t� inscrit au groupe
${ThisGroup}.

Pour vous connecter, suivez ce lien,
http://agora.lirmm.fr

(utilisez le nom d'utilisateur et le mot
de passe qui vous ont �t� envoy�s)


avec les remerciements de l'equipe de
developpement du prototype AGORA
(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.
">> ${BodyFile}




   fi

#   cat ${ThisGroupHTMLTail}   >> ${BodyFile}	    


   nbsSendEmailNotification "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Subject}" "${BodyFile}"

   MESSAGE="Construction d'un message � ${EmailAddress}"
   TAG="${FUNCNAME}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"

}




#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsBuildWelcomeMessage()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local  TargetMember="${3}" ;
   local  TargetSecret="${4}" ;

#   local  TargetKeyCode="${4}" ;

   local   ThisMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${ThisMember}"    )

   local TargetMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${TargetMember}"  )

   ThisGroupLanguage=$(miscQueryGroupLang "${ThisGroup}" "${ThisMember}" )

   ThisGroupHTMLHead="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/HTMLHead"

   ThisGroupHTMLTail="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/HTMLTail"

   ThisGroupBodyEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/BodyEn"   

   ThisGroupSubjectEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/SubjectEn"   
   
   ThisGroupBodyFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/BodyFr" 
   
   ThisGroupSubjectFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/SubjectFr"      

   
   if [ -z "${TargetMemberAlias}" ]; then
      TargetMemberAlias=${TargetMember};
   fi

   BodyFile="${AGORA_TMP}/bodymail--${ThisGroup}--${ThisMember}--${TargetMember}"


#   cat ${ThisGroupHTMLHead}   > ${BodyFile}

#   if [ ${ThisGroupLanguage:0:2} == "en" ]; then 

if [ 1 ]; then 

      Subject="$(cat ${ThisGroupSubjectEn} )" ;


echo "
Dear ${TargetMemberAlias},

To access to the GSD (Grid Shared Desktop), please go to the login page:
http://agora.sourceforge.net/services
then click on GSD [Access]

Your login is.....: ${TargetMember}
Your password is..: ${TargetSecret}

!! IMPORTANT: Login now and change your password


Best regards

The development team of the AGORA platform
(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.


" >> /dev/null

echo "
Bonjour,

Votre compte sur le service Agora vient d'�tre cr��:

Nom d'utilisateur..: ${TargetMember}
Mot de passe.......: ${TargetSecret}

Cordialement.

L'�quipe de d�veloppement du prototype AGORA

(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.

"  >> ${BodyFile}      



#      cat ${ThisGroupBodyEn}   >> ${BodyFile}

   else
   
      Subject="$(cat ${ThisGroupSubjectFr} )" ;

 Subject="[agora] Cr�ation de l'utilisateur"

#      cat ${ThisGroupBodyFr}  >> ${BodyFile}

echo "
Bonjour,

Ceci est un message de notification pour confirmer que
votre compte sur le service Agora vient d'�tre cr��.

Votre nom d'utilisateur..: ${TargetMember}
Votre mot de passe.......: ${TargetSecret}

Vous allez recevoir un second message,
avec l'intitul�: Nouveau membre,
pour confirmer que vous avez �t� inscrit dans un groupe.
Quand vous aurez re�u cet autre message vous pourrez
tester votre connexion et changer votre mot de passe.

Cordialement.

L'�quipe de d�veloppement du prototype AGORA

(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.

" >> ${BodyFile}



   fi

#   cat ${ThisGroupHTMLTail}   >> ${BodyFile}	    


   nbsSendEmailNotification "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Subject}" "${BodyFile}"

   MESSAGE="Construction d'un message � ${EmailAddress}"
   TAG="${FUNCNAME}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"

}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsBuildRequestToJoinGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local     ThisGroup="${1}" ;
   local    ThisMember="${2}" ;
   local  TargetMember="${3}" ;


   local   ThisMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${ThisMember}"    )

   local TargetMemberAlias=$( miscQueryMemberAlias  "${ThisGroup}"   "${TargetMember}"  )

   ThisGroupLanguage=$(miscQueryGroupLang "${ThisGroup}" "${ThisMember}" )

   ThisGroupHTMLHead="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/HTMLHead"

   ThisGroupHTMLTail="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/HTMLTail"

   ThisGroupBodyEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/BodyEn"   

   ThisGroupSubjectEn="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/SubjectEn"   
   
   ThisGroupBodyFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/BodyFr" 
   
   ThisGroupSubjectFr="${AGORA_HOME_GROUPS}/${ThisGroup}/${PARAMETERS_DIR}/nbsMessages/nbsWelcome/SubjectFr"

   
   if [ -z "${TargetMemberAlias}" ]; then
      TargetMemberAlias=${TargetMember};
   fi

   BodyFile="${AGORA_TMP}/bodymail--${ThisGroup}--${ThisMember}--${TargetMember}"


#   cat ${ThisGroupHTMLHead}   > ${BodyFile}

   if [ ${ThisGroupLanguage:0:2} == "en" ]; then 

      Subject="[AGORA] Request from a new member" ;

echo "
Dear ${TargetMemberAlias},

As manager of members for the group ${ThisGroup},
you are requested to grant a demand from ${ThisMemberAlias}.

Go to your usual account and under the agora services,
select the option: 
- Manage members > Validate a request

Best regards.

The development team of the AGORA platform
(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.


" >> ${BodyFile}      

#      cat ${ThisGroupBodyEn}   >> ${BodyFile}

   else
   
      Subject="[AGORA] Demande d'adh�sion au groupe ${ThisGroup}" ;

#      cat ${ThisGroupBodyFr}  >> ${BodyFile}

echo "
Bonjour ${TargetMemberAlias},

En tant que responsable des membres du groupe ${ThisGroup},
vous �tes sollicit� pour valider la demande de ${ThisMemberAlias}
pour rejoindre ce groupe.


1. Connectez-vous sur votre compte:
http://agora.lirmm.fr/soutenance

2. S�lectionnez d'abord l'onglet du groupe ${ThisGroup}.

3. Ensuite par le getionnaire des services Agora (icone avec les petits outils),
s�lectionnez l'option: 
- G�rer les membres de ce groupe > Valider une demande pour rejoindre ce groupe


Cordialement.

L'�quipe de d�veloppement du prototype AGORA

(c)2009 - L.I.R.M.M
Laboratoire d'Informatique, de Robotique,
et de Microelectronique de Montpellier.

" >> ${BodyFile}



   fi

#   cat ${ThisGroupHTMLTail}   >> ${BodyFile}	    


   nbsSendEmailNotification "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Subject}" "${BodyFile}"

   MESSAGE="Construction d'un message � ${EmailAddress}"
   TAG="${FUNCNAME}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"

}









#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsSendRequestToJoinGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local      ThisGroup="${1}" ;
   local     ThisMember="${2}" ;
   local    TargetGroup="${3}" ;


# 1. identifier tous les mms manager du groupe:

   declare -a AllMmsManagers=($(miscQueryMembersByRole ${TargetGroup} ${ThisMember} mms manager))

   for i in ${AllMmsManagers[@]}; do

      # Faire un build message � la place.

      nbsBuildRequestToJoinGroup ${TargetGroup} ${ThisMember} ${i}

#      nbsSendEmailNotification "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${Subject}" "${BodyFile}"

   done

# Note: pas besoin d'extraire l'email de ces personnes, c'est fait dans nbsSendEmailNotification


# 2. positionner un flag dans une liste pending requests
#    Attention ce flag doit etre dans une zone accessible en �criture par tous (hors groupe)

#   TargetDir="${AGORA_HOME_GROUPS}/${ThisGroup}/${NOTIFICATIONS_DIR}/External"


   TargetDir=${AGORA_TMP}/NotificationsExternal

   if [ ! -d "${TargetDir}" ]; then

     mkdir     ${TargetDir}
     chmod 777 ${TargetDir}
     
   fi
     

   TargetDir=${TargetDir}/${TargetGroup}

   if [ ! -d "${TargetDir}" ]; then

     mkdir     ${TargetDir}
     chown     ${ThisMember}.${TargetGroup} ${TargetDir}
     chmod 777 ${TargetDir}
     
   fi


   TargetDir=${TargetDir}/${ThisMember}
   
   if [ ! -d "${TargetDir}" ]; then

      mkdir     ${TargetDir}
      chown     ${ThisMember}.${TargetGroup} ${TargetDir}
      chmod 777 ${TargetDir}

   fi


# TODO
# 3. renvoyer un mail pour dire que la demande a bien �t� prise en compte


}






#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsValidateRequestToJoinGroup()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
   local      ThisGroup="${1}" ;
   local     ThisMember="${2}" ;
   local   TargetMember="${3}" ;

   TargetEmail=$( miscQueryMemberEmailAddress ${TargetMember} )

   sudo $AGORA_SERV/agoraCall.sh "mmsMemberAdd" "${ThisGroup}" "${ThisMember}" "${TargetMember}" "${TargetEmail}" > /dev/null



   rm -rf ${AGORA_TMP}/NotificationsExternal/${ThisGroup}/${TargetMember}

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function nbsSendEmailNotification()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local      ThisGroup="${1}" ;
   local     ThisMember="${2}" ;
   local   TargetMember="${3}" ;
   local   EmailSubject="${4}" ;
   local  EmailBodyFile="${5}" ;

   local    DestAddress=$(miscQueryMemberEmailAddress ${TargetMember} )
   local ReplyToAddress=$(miscQueryMemberEmailAddress ${ThisMember}   )

   local    TmpFileDestAddress=/tmp/nbs--${ThisGroup}--${ThisMember}--${TargetMember}--DestAddress
   local TmpFileReplyToAddress=/tmp/nbs--${ThisGroup}--${ThisMember}--${TargetMember}--ReplyToAddress
   local        TmpFileSubject=/tmp/nbs--${ThisGroup}--${ThisMember}--${TargetMember}--Subject
#   local           TmpFileBody=/tmp/nbs--${ThisGroup}--${ThisMember}--${TargetMember}--Body

   umask 000
   
   echo  "${DestAddress}"     > ${TmpFileDestAddress}
   echo  "${ReplyToAddress}"  > ${TmpFileReplyToAddress}
   echo  "${EmailSubject}"    > ${TmpFileSubject}
#   cat   "${EmailBodyFile}"   > ${TmpFileBody}
      
   sudo -u notification $AGORA_SERV/agoraCall.sh  "miscSendEmail" "${EmailBodyFile}" "${TmpFileSubject}" "${TmpFileReplyToAddress}" "${TmpFileDestAddress}"


   MESSAGE="Envoi d'un email � <* ${DestAddress} *> par <* ${ReplyToAddress} *>"
   TAG="${FUNCNAME}"

   hrsEventRecord  "${ThisGroup}" "${ThisMember}"  "${MESSAGE}" "$TAG"

   rm -f "${EmailBodyFile}"
   
   rm -f "${TmpFileDestAddress}" "${TmpFileReplyToAddress}" "${TmpFileSubject}"

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSendEmail()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
	local       ThisBodyFile="${1}"        ;
	local        ThisSubject=$(cat "${2}") ;
	local ThisReplyToAddress=$(cat "${3}") ;
	local    ThisDestAddress=$(cat "${4}") ;

	cat "${ThisBodyFile}" |

	mail -s "${ThisEmailSubject}" -c "${ThisReplyToAddress}" "${ThisDestAddress}"

}



#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function miscSendEmail_off()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{
     EmailBodyFile="${1}"
      EmailSubject="${2}"
    ReplyToAddress="${3}"
       DestAddress="${4}"

   cat "${EmailBodyFile}" | mail -s "${EmailSubject}" -c "${ReplyToAddress}" "${DestAddress}"

}










#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ E M S ~
#
#              E N V I R O N M E N T
#              M A N A G E M E N T
#                S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function emsServiceQuery()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{

   local  ThisGroup="${1}"
   local ThisMember="${2}"
   local in_PACKAGE="${3}"

   # TODO: Ecrire les fonctions �quivalentes pour RedHat, etc.  

   if [ -z `urpmq ${in_PACKAGE}` ]; then
     
      MESSAGE="Installation du paquetage <* ${in_PACKAGE} *>"
      TAG="${FUNCNAME}--${in_PACKAGE}"
     
      hrsEventRecord "${ThisGroup}" "${ThisMember}"  "${MESSAGE}"  "${TAG}"
     
      # TODO: executer au pr�alable une fonction d'�change de cl�s
      ssh root@localhost urpmi ImageMagick;
     
   fi

}





#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

function emsUpdateTemplate()

#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

{


   local  ThisGroup="${1}" ;
   local ThisMember="${2}" ;
   local      Level="${3}" ;

   local  SourceHome="${AGORA_HOME_DIR}/users/${ThisMember}"
   local SourceShare="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/share"
   local  SourceView="${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${ThisMember}/view"
   
   local   GroupHome="${AGORA_HOME_GROUPS}/${ThisGroup}/${GROUP_TEMPLATE}/${TEMPLATES_DIR}/homedir"
   local  GroupShare="${AGORA_HOME_GROUPS}/${ThisGroup}/${GROUP_TEMPLATE}/${TEMPLATES_DIR}/member/share"
   local   GroupView="${AGORA_HOME_GROUPS}/${ThisGroup}/${GROUP_TEMPLATE}/${TEMPLATES_DIR}/member/view"
   
   local  GlobalHome="${AGORA_SKEL_GROUP}/${TEMPLATES_DIR}/homedir"
   local GlobalShare="${AGORA_SKEL_GROUP}/${TEMPLATES_DIR}/member/share"
   local  GlobalView="${AGORA_SKEL_GROUP}/${TEMPLATES_DIR}/member/view"


   function updateGlobalTemplates()
   {
      Target=".kde/share"     
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalView}/${Target}"   "${SourceView}/${Target}" 
        
      Target=".local"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalView}/${Target}"   "${SourceView}/${Target}" 
 
      Target=".config"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalView}/${Target}"   "${SourceView}/${Target}" 

      Target=".openoffice.org2"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GlobalView}/${Target}"   "${SourceView}/${Target}"

   }



   function updateThisGroupTemplates()
   {
      Target=".kde/share"     
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupView}/${Target}"   "${SourceView}/${Target}" 
        
      Target=".local"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupView}/${Target}"   "${SourceView}/${Target}" 
 
      Target=".config"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupView}/${Target}"   "${SourceView}/${Target}" 

      Target=".openoffice.org2"
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupHome}/${Target}"   "${SourceHome}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupShare}/${Target}"  "${SourceShare}/${Target}" 
      miscDataInit "${ThisGroup}" "${ThisMember}" "${GroupView}/${Target}"   "${SourceView}/${Target}" 

   }

#miscQueryGroupMembers

#miscQueryGroupPresence

#      declare -a UserList=($(find ${AGORA_HOME_DIR}/users -mindepth 1 -maxdepth 1 -printf "%f " ))



   function updateAllUsersPrivateHomeDir()
   {
      declare -a UserList=($(miscQueryAllUsers "${ThisGroup}" "${ThisMember}"))

      for i in ${UserList[@]}; do

          if [ "${i}" != "${ThisMember}" ]; then
	  
             Target=".kde/share"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_DIR}/users/${i}"  "${SourceHome}/${Target}" 

             Target=".local"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_DIR}/users/${i}"  "${SourceHome}/${Target}" 

             Target=".config"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_DIR}/users/${i}"  "${SourceHome}/${Target}" 
          
	  fi
	  
      done
   }




   function updateGroupMembersSharedHomeDir()
   {
      declare -a MemberList=($(find ${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR} -mindepth 1 -maxdepth 1 -printf "%f " ))

      for i in ${MemberList[@]}; do

          if [ "${i}" != "${ThisMember}" ]; then
	  
             Target=".kde/share"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/share"  "${SourceShare}/${Target}"
	     miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/view"  "${SourceView}/${Target}"

             Target=".local"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/share"  "${SourceShare}/${Target}"
	     miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/view"  "${SourceView}/${Target}"

             Target=".config"
             miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/share"  "${SourceShare}/${Target}"
	     miscDataInit "${ThisGroup}" "${i}" "${AGORA_HOME_GROUPS}/${ThisGroup}/${MEMBERS_DIR}/${i}/view"  "${SourceView}/${Target}"
          
          fi
      
      done
   }



   if   [ ${Level} == "1" ]; then
   
       updateGlobalTemplates
   
   elif [ ${Level} == "2" ]; then

      updateThisGroupTemplates

   elif [ ${Level} == "3" ]; then

      updateGroupMembersSharedHomeDir

   elif [ ${Level} == "4" ]; then

      updateAllUsersPrivateHomeDir
   
   fi
   
   
}


function emsInit()
{
   echo "TODO" > /dev/null
}

function nbsInit()
{
   echo "TODO" > /dev/null
}


#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#                   ~ C S S ~
#
#            C O L L A B O R A T I V E
#                 S E S S I O N
#                 S E R V I C E
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+

# plus utilis� (remplac� par GMs)











#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+
#
#
#          H E L P
#
#
#---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+


function agoraHelp
{
   agoraSetup
   echo "
+---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+   
   Help list:
    
   [agoraHelp1]: D�coupage de cha�nes de caract�res bas�e sur des motifs:

+---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---.~---~~---+   
   "
}


function agoraHelp1
{
   agoraHelp
   echo "
   Notation ##
   Permet d'�liminer la plus longue cha�ne en correspondance avec le motif : 

     Var='tonari no totoro'
     echo \${Var##*to}

     ro

   ici le motif est *to, et la plus longue correspondance "tonari no toto"1.
   Cette forme est utile pour r�cup�rer l'extension (suffixe) d'un nom de fichier :


   Notation #
   Elimine en plus la  plus courte cha�ne en correspondance : 

     Var='tonari no totoro'
     echo \${Var#*to}

     nari no totoro
   "
}

